You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 20:56:11