【问题标题】:powershell replace $_ if criteria meets如果条件满足,powershell 替换 $_
【发布时间】:2018-08-24 10:10:09
【问题描述】:

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

最后一次替换只提供了一半的结果 期待。

如果有包含“JOB”和“TIMETO”的行,它们将不会显示(因为Where-Object)

如果提到的“TIMETO”属性已经存在,如何保持行?

例子:

文件中的源代码行(没有“TIMETO”):

<JOB JOBISN="30" USER="testuser">

正确替换:

<JOB TIMETO="TEST" JOB JOBISN="30" USER="testuser">

....

....

文件中的源代码行(带有“TIMETO”):

<JOB JOBISN="30" USER="testuser" TIMETO="0400">

replace -> 这行不会显示!!

..

提前致谢!兄弟丹尼尔

【问题讨论】:

  • 用括号括起来整个-replace 逻辑。或者更好的是,使用 .Replace() 字符串方法,因为你没有对正则表达式做任何特别的事情。
  • @AnsgarWiechers 我永远不会反对该帖子的链接。
  • @Ansgar Wiechers - 为什么不呢?因为性能影响?
  • @TheIncorrigible 我发布的代码只是整个替换的一部分 - 还有更多替换包括正则表达式

标签: powershell replace foreach


【解决方案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.

【讨论】:

  • 该解决方案的问题是,无论“timeto”是否匹配,都必须完成其他替换(例如table_name和option)。
  • @DanijeldeVasco 编辑中快速而肮脏的解决方案。不过说真的,请考虑对象方法。
猜你喜欢
  • 2013-11-15
  • 2021-12-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-18
相关资源
最近更新 更多