【发布时间】:2021-03-29 11:11:29
【问题描述】:
下面是我的 XML
<step>
<filename>tk1872_01\data\nx1872\nx1872_base_include_wrn.dat</filename>
<lookfor>W:\\ugs</lookfor>
<replace>C:\BM\ugs</replace>
</step>
<step>
<filename>NX1872_01\tools\checkReg.ps1</filename>
<lookfor>W:\\ugs</lookfor>
<replace>C:\BM\ugs</replace>
</step>
<step>
<filename>tk1872_01\data\nx1872\nx1872_base_include_wrn.dat</filename>
<lookfor>Y:\\CATIAcfgV5</lookfor>
<replace>C:\BM\CATIAcfgV5</replace>
</step>
我正在尝试参考上述 XML 来替换 filename 节点中提到的文件中的字符串。
例如:我从 XML 中获取文件名及其路径的参考,例如 (tk1872_01\data\nx1872\nx1872_base_include_wrn.dat) 然后我查找 "W:\ugs" 并替换为 “C:\BM\ugs”。这是 foreach 循环的第一步,但如果您看到具有相同文件名的第三步,但我正在寻找不同的字符串,但 foreach 循环没有替换具有相同文件名的第二次出现。
下面是我在 Powershell 中使用的代码
$testXML = C:\test\settings.xml
[xml]$SpecialXMLFile = Get-Content $testXML
foreach ($step in $SpecialXMLFile.step)
{
$_aux = C:\temp
$_aux_dest = D:\temp
$srcfilename = $_aux + "\" + $step.filename
$destfilename = $_aux_dest + "\" + $step.filename
$strun = Get-Content $srcfilename
$strun -replace $step.lookfor, $step.change | Out-File -Encoding ascii $destfilename
}
能否请您告诉我哪里做错了或者我需要添加更多步骤?
【问题讨论】:
-
$SpecialXMLFile.configuration.replace.step 应该是 $SpecialXMLFile.configuration.step.replace 否?
-
您发布的 XML 与您在代码中声明的路径不匹配。它缺少[配置],并且您的代码中有一些项目没有说明有什么或有什么用途,最后,您确实过度设计了这个用例。 XML/JSON 是 PowerShell 原生的,它有 cmdlet 可以使用它们。
-
@Esperento57 是的,抱歉,我忘记提及的步骤节点之前还有两个节点
-
@postanote 我正在使用 XML 文件,因为我不想每次都更改代码,每次我只是在 XML 中进行更改以修改我的代码,因此它会在配置文件中进行更改。
-
那么,您是说您永远不知道 XML 文件中的内容吗?您只需将代码设置为读取您收到的 XML 并提示您要使用的节点/值。在我提供的示例中,它只是抓取主配置节点并显示要使用的步骤节点。然后,您可以根据需要使用这些参数。你可以提示任何一个。无需更改基本代码。
标签: xml powershell foreach