如果标准符合,powershell将替换$ _

时间:2018-03-15 14:31:38

标签: powershell replace foreach

我读了一个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

1 个答案:

答案 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