脚本参数中的 Powershell 换行符不起作用

Powershell newline in script argument not working

我有这个小脚本,我用不同的 RegEx 参数调用它来替换文件中的文本:

param ($file, $fnd, $rpl)

(Get-Content $file -Raw) -replace $fnd , $rpl | Set-Content $file

问题是如果我向它传递一个包含新行转义代码 `r`n 的参数,如下所示:

powershell -File txt-replace.ps1 "file path" "RegEx_pattern" "line1`r`nline2"

将写入文件:

line1`r`nline2

而不是:

line1
line2

但如果我在脚本中定义 $rpl,并使用确切的参数内容,它就会起作用:

$rpl = "line1`r`nline2"

写道:

line1
line2

如果我 运行 它也可以作为 widows 终端中的命令使用:

powershell -command "(Get-Content file_path | Out-String ).Trim() | ForEach-Object {$_ -replace 'RegEx_pattern' , \"line1`r`nline2\"} | Set-Content file_path "

我在脚本中进一步调试它:

write-host $rpl

在终端中写入:

line1`r`nline2

但是

$rpl= "line1`r`nline2"
write-host $rpl

在终端中写入:

line1
line2

我错过了什么?

直接用-Command参数最简单

powershell -Command  ".\txt-replace.ps1 \"file path\" \"RegEx_pattern\" \"line1`r`nline2\""

反斜杠转义符用于 CMD shell。由于您希望将这些引号传递给 PowerShell,因此我们需要先在 CMD shell 层对它们进行转义。否则,CMD 会认为它们是周围的字符串以供其解释。

当使用 -File 时,脚本参数在当前 shell 解释后按字面意思传递。 CMD 不知道换行符是什么,所以它们只是保留 `r`n,然后作为字符串参数之一按字面意思传递。

使用 -Command 时,命令字符串被视为是在 PowerShell 提示符下输入的。

有关详细信息,请参阅 About_PowerShell.exe