【问题标题】:Powershell script is failing when I am trying to replace parameters using ForEach-Object当我尝试使用 ForEach-Object 替换参数时,Powershell 脚本失败
【发布时间】:2018-08-07 20:57:09
【问题描述】:

我的 PowerShell 脚本中的函数如下:

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

}

我得到的错误是:

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

【问题讨论】:

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

标签: powershell


【解决方案1】:

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

由于Foreach-Object 是一个cmdlet,它后面的标记在argument mode 中被解析,这意味着它们要么被解释:

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

  • 作为 位置参数 否则。

虽然-replace表达式模式 中的运算符,但传递给ForEach-Object 它却被解释为参数名称

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

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

在脚本块内,你必须使用automatic variable $_来引用手头的输入对象:

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

$开头的语句在表达式模式中被解析,然后你可以使用运算符比如-replace,如上图。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-01-13
    • 2020-10-06
    • 1970-01-01
    • 1970-01-01
    • 2012-10-02
    • 2020-03-22
    • 1970-01-01
    相关资源
    最近更新 更多