当我尝试使用ForEach-Object替换参数时,Powershell脚本失败

时间:2018-08-07 20:57:10

标签: powershell

PowerShell脚本中的功能如下:

function replace-file-content([string] $path, [string] $replace, [string] $replacewith) {
    (Get-Content $path) |
      Foreach-Object -replace{$replace,$replacewith}|
        Out-File $path

}

我遇到的错误是:

  

ForEach-Object:无法绑定参数“ Process”。无法将类型“ System.String”的“ -replace”值转换为类型“ System.Management.Automation.ScriptBlock”。

1 个答案:

答案 0 :(得分:2)

  

Foreach-Object -replace{$replace,$replacewith}

由于Foreach-Object cmdlet ,因此其后的标记将在argument mode中进行解析,这意味着它们将被解释:

  • 参数名称(如果它们以-

  • 开头)
  • 否则为位置参数

虽然-replace是处于表达式模式 operator ,并传递给ForEach-Object,但它却被解释为参数名称

但是,ForEach-Object没有名为-replace参数,这说明了您看到的错误(在PSv2中;在PSv5.1 +(可能更早)中,它是一个不同的错误,很遗憾, less 显而易见)。

您的意思是在script block-replace内使用{ ... } (可按需执行的PowerShell代码的可重用部分-本身形成一个 new 解析上下文;您可以将这样的脚本块传递给ForEach-Object 按位置,在这种情况下,它隐式绑定到
-Process参数,或显式参数名称为-Process;该脚本块指定了要为每个输入对象执行的代码。

在脚本块中,您必须使用automatic variable $_来引用当前的输入对象:

# Same as: Foreach-Object -Process { $_ -replace $replace, $replacewith }
Foreach-Object { $_ -replace $replace, $replacewith }

$开头的语句以表达式模式进行解析,在该模式下,您可以使用诸如-replace之类的 operators ,如上所示。