我读了一个xml文件,想要替换三个字符串。
我的代码:
foreach ($file in Get-ChildItem $files){
(Get-Content $file) | Foreach-Object {
$_ -replace 'TABLE_NAME="\$ZoneProdukt\$', ('TABLE_NAME="' + $ZONPRODLANG)`
-replace 'OPTION="Copy" ', '' `
-replace ('<JOB ','<JOB TIMETO="TEST" ') | ? {$_ -notlike "*TIMETO=`""}
} | Set-Content ($destination_folder + $file.name)
}
最后一次替换仅提供结果的一半 期望的。
如果有行包含&#34; JOB&#34;和&#34; TIMETO&#34;它们不会显示(因为Where-Object)
如果提到的&#34; TIMETO&#34; -Attribute已经存在,如何保持线路?
的示例:
文件中的源代码行(没有&#34; TIMETO&#34;):
<JOB JOBISN="30" USER="testuser">
正确替换:
<JOB TIMETO="TEST" JOB JOBISN="30" USER="testuser">
...
...
文件中的源代码行(&#34; TIMETO&#34;):
<JOB JOBISN="30" USER="testuser" TIMETO="0400">
替换 - &gt;这条线不会显示!!
...
提前谢谢! br danijel答案 0 :(得分:1)
您可以在ForEach-Object
中使用if语句:
foreach ($file in Get-ChildItem $files){
(Get-Content $file) | Foreach-Object {
if($_ -like "*TIMETO=`""){
$_ -replace 'TABLE_NAME="\$ZoneProdukt\$', ('TABLE_NAME="' + $ZONPRODLANG)`
-replace 'OPTION="Copy" ', '' `
}else{
$_ -replace 'TABLE_NAME="\$ZoneProdukt\$', ('TABLE_NAME="' + $ZONPRODLANG)`
-replace 'OPTION="Copy" ', '' `
-replace ('<JOB ','<JOB TIMETO="TEST" ')
}
} | Set-Content ($destination_folder + $file.name)
}
使用正则表达式操作xml通常是不好的做法。您应该使用Get-Content
并投射为[xml]
,这将允许您操纵对象。 Check out this this MSDN demo