Bat调用PowerShell创建JSON文件时引号与大括号转义问题求助
解决Bat调用PowerShell写入JSON内容时的转义问题
问题原因
Bat和PowerShell的转义规则完全不同:
- PowerShell用反引号
`作为转义符; - Bat用脱字符
^作为转义符,且会自动解析命令行中的引号、特殊字符,导致传递给PowerShell的参数被篡改。
直接调整转义的解决方案
修改Bat中的命令,适配两种环境的转义规则:
powershell -Command "New-Item -Path $env:userprofile\Desktop\Cloack -Name 'test.json' -ItemType 'file' -Value '{ `"a`":b, ``n `"b`":c, etc .}'"
关键调整点:
- 用单引号包裹不需要转义的参数(如
'test.json'),避免和外层双引号冲突; - Bat中要传递给PowerShell的双引号,需用
^转义为"; - PowerShell的换行符
`n,在Bat中要写成n ``(两个反引号),因为Bat会吃掉其中一个。
更可靠的Base64编码方案
如果命令复杂,转义容易出错,推荐用PowerShell的-EncodedCommand参数:
- 先在PowerShell中生成命令的Base64编码:
$cmd = 'New-Item -Path $env:userprofile\Desktop\Cloack -Name "test.json" -ItemType "file" -Value "{ `"a`":b, `n `"b`":c, etc .}"' [Convert]::ToBase64String([System.Text.Encoding]::Unicode.GetBytes($cmd))
- 将输出的编码字符串复制到Bat中:
powershell -EncodedCommand VgBlAHMAdABJAHQAZQBtACAALQBQAGEAdABoACAAJABlAG4AdgA6AHUAcwBlAHIAcAByAG8AZgBpAGwAZQAkAEQAZQBzAGsAdABvAHAAXABDAGwAbwBhAGMAawAgAC0ATgBhAG0AZQAgACIAdABlAHMAdAAuAGoAcwBvAG4AIgAgAC0ASQB0AGUAbQB0AHkAcABlACAAIgBmaWxlACIAIAAtAFYAYQBsdQBlACAAIgB7ACAAYQBcADoAYgAsACAAYgBcADoAYwAsACAAZXRjACAAIgA=
这种方式完全避开转义冲突,确保命令原封不动传递给PowerShell执行。
内容的提问来源于stack exchange,提问作者Андрей Киселев
相关产品推荐
相关产品推荐

