批量更改 SAS 项目代码节点目录



我有一个 SAS 项目(SAS 企业指南版本 7.15(,所有 sas 代码节点当前都保存在目录位置,

'C:\Users\SAS\Prod\SASCode'.我正在将此项目备份到开发区域,我想将 sas 代码节点保存到以下开发位置"C:\用户\SAS\Prod\SASCode"。有没有办法我可以将所有这些 sas 代码节点的位置批量更改为上述 Dev 位置,而不是进入单个 sas 代码节点并逐个更改它,这当然是非常耗时的过程。

企业指南项目文件实际上是 zip 存档中的文件集合,其文件扩展名为 .egp 而不是 .zip。

假设您的代码节点是操作系统中单个文件夹中文件的快捷方式,并且您希望更改这些文件所在的位置。 快捷方式的目标存储在 egp 文件中的包含文件中,project.xml作为项目元数据。project.xml是 UTF-16 编码的文件,快捷方式是<FullPath>节点中的 xml 数据。 xml文件非常系统,可以进行文本处理,而无需进行完整的xml解析。 目标是将旧路径替换为 FullPath 节点中数据的新路径。

Powershell是一个非常有效的Windows脚本工具,可用于撕裂项目文件,修改路径并将部分重新组装回.egp项目文件。

请考虑以下Powershell脚本:

原始项目的代码节点是 C:\Zeus\sources 中文件的快捷方式。 假设这些源被复制或移动到 C:\Olympus\sources。 必须修改更新的 EG 项目的代码节点以指向新位置。

$egpIn  = 'C:Q1Zeus.egp'
$egpOut = 'C:Q2ZeusModified.egp'
$oldPath = 'C:Zeussources'
$newPath = 'C:Olympussources'
Copy-Item "$oldPath*.sas" -Destination $newPath
$oldLandmark = [regex]::Escape('&lt;FullPath&gt;' + $oldPath)
$newLandmark =                 '&lt;FullPath&gt;' + $newPath
$workingFolder = 
[System.IO.Path]::Combine(
[System.IO.Path]::GetTempPath(),
[System.IO.Path]::GetRandomFilename()
)
[System.IO.Compression.ZipFile]::ExtractToDirectory($egpIn, $workingFolder)
Get-ChildItem $workingFolder *.xml -recurse |
Foreach-Object {
$fileContent = ($_ | Get-Content -Encoding Unicode)
$fileContent = $fileContent -replace $oldLandmark, $newLandmark
[IO.File]::WriteAllText($_.FullName, ($fileContent -join "`r`n"), [System.Text.Encoding]::Unicode)
}
if (Test-Path $egpOut) 
{
Remove-Item $egpOut 
}
[System.IO.Compression.ZipFile]::CreateFromDirectory($workingFolder,$egpOut)
Remove-Item $workingFolder -Recurse

应该是可能的,因为EG-Project基本上是包含各种元素的ZIP文件。
其中一个元素是文件"project.xml",其中包含对外部代码文件的引用。
将此引用替换为新位置应该可以解决您的问题。

最新更新