PowerShell含特殊字符序列的CLI调用转义问题求助
PowerShell跨进程/SSH传递含特殊字符脚本的解决方案
问题根源
当你通过cmd.exe或ssh传递包含n(换行符)的PowerShell代码时,n会被解析为实际的换行符。而在命令行环境中,换行意味着当前命令结束,后续内容会被当作新命令执行——这直接破坏了单引号的闭合,导致出现「缺少终止符'」的解析错误。
解决方案
方法1:使用Base64编码(推荐,适用于所有复杂场景)
PowerShell支持通过-EncodedCommand参数执行Base64编码的脚本,这种方式可以完全避免特殊字符的转义问题,是跨进程/远程执行脚本最可靠的方案。
针对cmd调用的简化示例修正:
$specialChar = "`nMatch" # 定义要执行的PowerShell脚本内容 $scriptContent = "Write-Output '$specialChar'" # 将脚本编码为Unicode格式的Base64字符串 $encodedScript = [Convert]::ToBase64String([Text.Encoding]::Unicode.GetBytes($scriptContent)) # 通过cmd执行编码后的脚本 cmd.exe /c "powershell -EncodedCommand $encodedScript"
针对SSH远程写入文件的最终场景修正:
$specialChar = "`nMatch all`n" # 构建远程要执行的完整脚本 $scriptContent = "Add-Content -Force -Verbose -Path c:\ProgramData\ssh\sshd_config -Value '$specialChar'" # 编码为Base64 $encodedScript = [Convert]::ToBase64String([Text.Encoding]::Unicode.GetBytes($scriptContent)) # 通过SSH传递编码后的命令 ssh $Username@$ComputerIP "powershell -EncodedCommand $encodedScript"
方法2:手动转义特殊字符
如果场景简单,也可以通过双重转义`n为``n,确保远程PowerShell能正确解析为换行符,同时注意外层命令的引号包裹:
$specialChar = "``nMatch all``n" $rmtScript = "powershell Add-Content -Force -Verbose -Path c:\ProgramData\ssh\sshd_config -Value '$specialChar'" ssh $Username@$ComputerIP $rmtScript
注意:手动转义仅适用于简单场景,当脚本包含更多特殊字符(如双引号、反斜杠等)时,容易出现转义遗漏,推荐优先使用Base64编码方案。
内容的提问来源于stack exchange,提问作者JackOA
相关产品推荐
相关产品推荐

