【问题标题】:bulk change sas project code nodes directory批量更改 sas 项目代码节点目录
【发布时间】:2019-11-25 10:12:20
【问题描述】:

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

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

【问题讨论】:

    标签: sas sas-macro enterprise-guide


    【解决方案1】:

    企业指南项目文件实际上是 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
    

    【讨论】:

    • 太棒了 ? 我想我们的 OPS 会喜欢这个小 shellscript ☺️ 谢谢。
    【解决方案2】:

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

    【讨论】:

    • 嗨,Michael 感谢您的回答,但是,我无法在我的项目 project.xml 中找到此文件。你知道我应该在哪里找到这个文件吗?
    • 短版:解压缩您的 .egp 文件,您可以在其中找到 project.xml 和各种其他内容,例如项目安全代码节点中的 sas 代码和内部日志。对于外部 sas 代码,您可以找到对 .sas 文件的引用,例如 project.xml 中的链接。理查德在他的回答中提供了更详细的信息。
    猜你喜欢
    • 1970-01-01
    • 2016-11-01
    • 2021-06-13
    • 1970-01-01
    • 1970-01-01
    • 2011-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多