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



我的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-Objectcmdlet,因此后面的令牌将在参数模式中解析,这意味着它们要么被解释:

  • 作为参数名称,如果它们以-开头

  • 否则为位置参数

虽然-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,如上所示。

最新更新