运行 PowerShell 脚本块

Running a script block for PowerShell

当 运行 下面的部分通过 PowerShell 提示时,它会做它应该做的事 - 将包含 MYID 的任何内容更改为 MyValue

(Get-Content C:/tmp/test.txt) | ForEach-Object {$_ -replace "MYID", "MyValue"} | Set-Content C:/tmp/test.txt

然而,当我 运行 通过如下脚本块时,它失败了:

PowerShell Invoke-Command -ScriptBlock {Get-Content C:/tmp/test.txt | ForEach-Object {$_ -replace "MYID", "MyValue"} | Set-Content C:/tmp/test.txt}

下面是上面命令的踪迹

λ powershell invoke-command -scr {get-content c:\tmp\test.txt | foreach-object {$_ -replace "MYID", "MyValue"} | set-content c:\tmp\test.txt} 'foreach-object' n’est pas reconnu en tant que commande interne ou externe, un programme exécutable ou un fichier de commandes.

我试着做了如下所示的多种变体

 powershell invoke-command -scr {(get-content c:\tmp\test.txt) | (foreach-object {$_ -replace "MYID", "MyValue"}) | (set-content c:\tmp\test.txt)}

上面的命令,给我以下错误

} was not expected.

有什么想法吗?

如果您只想在正常情况下在本地计算机上执行命令,则不需要使用 Invoke-Command 或脚本块。相反,我们可以只使用 -Command 切换到 PowerShell:

powershell -command "(get-content c:\tmp\test.txt) | foreach-object { $_ -replace 'MYID', 'MyValue' } | set-content c:\tmp\test.txt"

注意 -replace 字符串周围的单引号;这避免了命令处理器转义的问题。此命令在我的机器上适用于多行文件,但如果文件仍在打开时给您带来麻烦,您可以使用此版本,它会完整读取文件而不是逐行读取文件:

powershell -c "(get-content c:\tmp\test.txt -raw) -replace 'MYID', 'MyValue' | set-content c:\tmp\test.txt -nonewline"