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

bulk change sas project code nodes directory

我有一个 SAS 项目(SAS Enterprise Guide 7.15 版),所有 sas 代码节点当前都保存在目录位置,

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

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

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

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

Powershell 是一个非常强大的 Windows 脚本编写工具,可用于拆分项目文件、修改路径并将各个部分重新组装回 .egp 项目文件。

考虑这个 powershell 脚本:

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

$egpIn  = 'C:\Q1\Zeus.egp'
$egpOut = 'C:\Q2\ZeusModified.egp'

$oldPath = 'C:\Zeus\sources'
$newPath = 'C:\Olympus\sources'

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