【问题标题】:Powershell: Order of Replacement with ForEach-Object [duplicate]Powershell:用 ForEach-Object 替换的顺序 [重复]
【发布时间】:2020-10-06 09:09:34
【问题描述】:

我正在 Powershell 中查找/替换单词。我很好奇替换顺序。

想让它依次用Test2替换Test1,然后用Test3替换Test2的某些字符串组合(见下文)。

1) 只是好奇它下面的代码是否安全?或者 Powershell 是否同时运行,从而打破了我的必需序列替换模式?

这似乎是工作,只是想 100% 确定。否则,我可以在第一次替换完成后编写另一个 foreach 循环。

2) 另外,我需要下面的管道分隔符吗?不知道他们做了什么,从以前的程序员那里继承了这个脚本,试图谷歌和研究 powershell。

#Replace words in file
$TestFiles = Get-ChildItem $DBContextDestination   *.cs -rec
foreach ($file in $TestFiles )
{
    (Get-Content $file.PSPath) |
    Foreach-Object { $_ -replace "abcd", "1234" } |
    Foreach-Object { $_ -replace "Test1;", "Test2" } |
    Foreach-Object { $_ -replace "Class Test2 Object", "Class Test3 Object" } |
    Set-Content -Encoding UTF8  $file.PSPath
}

【问题讨论】:

  • 对于每个单独的输入项,管道中的命令将按顺序执行,即。在通过第二个之前,没有输入字符串会到达第三个 ForEach-Object 块,依此类推
  • 嗨@MathiasR.Jessen 谢谢,随时写答案,我可以发送积分,我是否也需要 |最后的管道分隔符?这样能保证顺序吗?
  • 它们并不是真正的“分隔符”,但是是的,您确实需要 | 才能将它们“绑定”在一起。我关闭它的副本的答案解释了管道的工作原理

标签: powershell powershell-4.0 powershell-ise


【解决方案1】:

是的,与 unix 中的管道不同,没有任何东西在后台运行。如果发送一个对象,它会按顺序从左到右通过管道。您还可以链接替换。 Test1后面应该有分号吗?

(Get-Content $file.PSPath) -replace "abcd", "1234" -replace "Test1;", 
  "Test2" -replace "Class Test2 Object", "Class Test3 Object"

【讨论】:

  • 你好,你能不能也回答一下,上面第二个问题,谢谢
  • 你拥有它的方式很好。
  • 好的,那么我会保留管道分隔符吗?它似乎保持顺序
  • 是的............
猜你喜欢
  • 2018-02-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-06
相关资源
最近更新 更多