我的PowerShell脚本中的函数如下:
function replace-file-content([string] $path, [string] $replace, [string] $replacewith) {
(Get-Content $path) |
Foreach-Object -replace{$replace,$replacewith}|
Out-File $path
}
我得到的错误是:
ForEach对象:无法绑定参数"Process"。无法将"System.String"类型的"-replacement"值转换为"System.Management.Automation.ScriptBlock"类型。
Foreach-Object -replace{$replace,$replacewith}
由于Foreach-Object
是cmdlet,因此后面的令牌将在参数模式中解析,这意味着它们要么被解释:
-
作为参数名称,如果它们以
-
开头 -
否则为位置参数。
虽然-replace
是表达式模式中的运算符,但传递给ForEach-Object
时,它被解释为参数名。
然而,ForEach-Object
没有名为-replace
的参数,这解释了您看到的错误(在PSv2中;在PSv5.1+(可能更早(中,这是一个不同的错误,令人遗憾的是,较少明显(。
您想要做的是在脚本块({ ... }
(中使用-replace
,这是一段可按需执行的PowerShell代码,它本身形成了一个新的解析上下文;您可以将这样的脚本块按位置传递给ForEach-Object
,在这种情况下,它隐式绑定到-Process
参数,或者显式绑定到参数名称-Process
;该脚本块指定要为每个输入对象执行的代码。
在脚本块中,必须使用自动变量$_
来引用手头的输入对象:
# Same as: Foreach-Object -Process { $_ -replace $replace, $replacewith }
Foreach-Object { $_ -replace $replace, $replacewith }
以$
开头的语句在表达式模式中解析,然后可以在其中使用运算符,如-replace
,如上所示。