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”。
答案 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 ,如上所示。