批量更改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('<FullPath>' + $oldPath)
$newLandmark = '<FullPath>' + $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
我有一个 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('<FullPath>' + $oldPath)
$newLandmark = '<FullPath>' + $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