如何解决脚本参数中的 Powershell 换行符不起作用
我有这个小脚本,我用不同的 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。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。