如何从.bat文件中转义PowerShell双引号

cis*_*iso 3 powershell escaping batch-file

我正在尝试使用从Windows 7中的bat文件运行的PowerShell命令,用两个双引号替换文件(temp1.txt)中的所有双引号:

powershell -Command "(gc c:\temp\temp1.txt) -replace '\"', '\"\"' | Out-File -encoding UTF8 c:\temp\temp2.txt"
Run Code Online (Sandbox Code Playgroud)

我一直收到错误:

 'Out-File' is not recognized as an internal or external command.
Run Code Online (Sandbox Code Playgroud)

当我更改命令以用字母"b"替换字母"a"时,它可以正常工作:

powershell -Command "(gc c:\temp\temp1.txt) -replace 'a', 'b' | Out-File -encoding UTF8 c:\temp\temp2.txt"
Run Code Online (Sandbox Code Playgroud)

我需要转义双引号,因为整个powershell -Command都是双引号字符串.你怎么逃避双重报价?

bri*_*ist 6

嗯,在这里你需要"在双引号字符串内转义命令行.从我的测试来看,唯一可行的是""""引用参数中的四重双引号:

powershell.exe -command "echo '""""X""""'"
Run Code Online (Sandbox Code Playgroud)

那么你的命令行应该是:

powershell -Command "(gc c:\temp\temp1.txt) -replace '""""', '""""""""' | Out-File -encoding UTF8 c:\temp\temp2.txt"
Run Code Online (Sandbox Code Playgroud)

还有另一种方法可以使用PowerShell来处理这个问题,假设您不想将这些命令放在文件中并以这种方式调用它:use -EncodedCommand.这使您可以对整个命令或脚本进行base64编码,并将其作为单个参数传递给命令行.

所以这是你的原始命令:

(gc c:\temp\temp1.txt) -replace '"', '""' | Out-File -encoding UTF8 c:\temp\temp2.txt
Run Code Online (Sandbox Code Playgroud)

这是一个编码它的脚本:

$c = @"
(gc c:\temp\temp1.txt) -replace '"', '""' | Out-File -encoding UTF8 c:\temp\temp2.txt
"@
$b = [System.Text.Encoding]::Unicode.GetBytes($c)
$e = [System.Convert]::ToBase64String($b)
Run Code Online (Sandbox Code Playgroud)

$e 现在包含:

KABnAGMAIABjADoAXAB0AGUAbQBwAFwAdABlAG0AcAAxAC4AdAB4AHQAKQAgAC0AcgBlAHAAbABhAGMAZQAgACcAIgAnACwAIAAnACIAIgAnACAAfAAgAE8AdQB0AC0ARgBpAGwAZQAgAC0AZQBuAGMAbwBkAGkAbgBnACAAVQBUAEYAOAAgAGMAOgBcAHQAZQBtAHAAXAB0AGUAbQBwADIALgB0AHgAdAA =

所以你的新命令行可以是:

powershell.exe -encodedCommand KABnAGMAIABjADoAXAB0AGUAbQBwAFwAdABlAG0AcAAxAC4AdAB4AHQAKQAgAC0AcgBlAHAAbABhAGMAZQAgACcAIgAnACwAIAAnACIAIgAnACAAfAAgAE8AdQB0AC0ARgBpAGwAZQAgAC0AZQBuAGMAbwBkAGkAbgBnACAAVQBUAEYAOAAgAGMAOgBcAHQAZQBtAHAAXAB0AGUAbQBwADIALgB0AHgAdAA=
Run Code Online (Sandbox Code Playgroud)

没有必要担心逃避任何事情.

  • 我讨厌我才刚刚了解到这一点。你知道我花了多少时间双转义和四转义引号并运行和重新运行批处理脚本试图让一切“恰到好处”正确吗?谢谢 (2认同)