【问题标题】:Basic PowerShell Script Issue: "Expressions are only allowed as the first element of a pipeline"基本 PowerShell 脚本问题:“表达式只允许作为管道的第一个元素”
【发布时间】:2014-09-24 12:40:58
【问题描述】:

我正在尝试编写一个简单的脚本来读取一个文件,定位一个字符串,用另一个字符串替换该字符串,并将所有新文件内容(带有替换的字符串)存储在一个新文件中。这是我正在使用的:

(Get-Content C:\file1.txt) | {$_ -replace "this:text", "withthis:text"} | Set-Content C:\file2.txt

我收到的错误是:“表达式只允许作为管道的第一个元素”

我很确定这是因为冒号“:”字符出现在我要查找和替换的字符串中。我试过用“\”和“`”字符转义冒号字符,但我收到了同样的错误。有谁知道这是怎么回事?

感谢您的帮助。

【问题讨论】:

    标签: powershell scripting


    【解决方案1】:

    问题出在管道中的第二个元素。

    {$_ -replace "this:text", "withthis:text"}
    

    这是一个脚本块(即一段代码)。如果您想将脚本块应用于管道上的所有传入项目,您可以使用 foreach-object cmdlet,如下所示:

    (Get-Content C:\file1.txt) | foreach-object {$_ -replace "this:text", "withthis:text"} | Set-Content C:\file2.txt
    

    @shagun 使用 % 别名作为 foreach-object cmdlet,因此代码看起来也正确。

    【讨论】:

    • 仅供参考:如果您有自己的流水线准备好的脚本块(例如{ process { $_ * 2 }}),您可以使用调用运算符(&):1, 2, 3 | & { process { $_ * 2 }}
    • 补充@BartekB 的注释,如果你有一个带有ValueFromPipeline 参数的脚本块,比如param([Parameter(ValueFromPipeline)]$x)$x 也将在脚本块用作参数时正确接收每个元素& 在管道中。这可能是编写脚本块的一种有用方法,因为您可以在管道中或单独调用它,如果您使用$_,这会很棘手。
    【解决方案2】:

    我猜这是因为在第一个管道之后您没有处理每个结果。所以正确的会根据我的:

    (Get-Content C:\file1.txt) | %{$_ -replace "this:text", "withthis:text"} | Set-Content C:\file2.txt
    

    【讨论】:

      猜你喜欢
      • 2014-05-26
      • 2011-11-01
      • 2014-12-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-18
      • 2013-11-08
      • 2017-06-25
      相关资源
      最近更新 更多