如何从 .bat 文件中转义 PowerShell 双引号
How to escape PowerShell double quotes from a .bat file
我正在尝试使用 Windows 中的 bat 文件中的 PowerShell 命令 运行 将文件 (temp1.txt) 中的所有双引号替换为两个双引号 7:
powershell -Command "(gc c:\temp\temp1.txt) -replace '\"', '\"\"' | Out-File -encoding UTF8 c:\temp\temp2.txt"
我一直收到错误消息:
'Out-File' is not recognized as an internal or external command.
当我更改命令以将字母 "a" 替换为字母 "b" 时,它工作正常,如下所示:
powershell -Command "(gc c:\temp\temp1.txt) -replace 'a', 'b' | Out-File -encoding UTF8 c:\temp\temp2.txt"
我需要转义双引号,因为整个 powershell -Command
都在双引号字符串中。你如何转义双引号?
PowerShell 的转义符是重音符号。试试这个:
powershell -Command "(gc c:\temp\temp1.txt) -replace `", `"`" | Out-File -encoding UTF8 c:\temp\temp2.txt"
嗯,这里你需要转义命令行上的 "
,在双引号字符串中。根据我的测试,唯一似乎有效的是引用参数内的四双引号 """"
:
powershell.exe -command "echo '""""X""""'"
那么你的命令行应该是:
powershell -Command "(gc c:\temp\temp1.txt) -replace '""""', '""""""""' | Out-File -encoding UTF8 c:\temp\temp2.txt"
还有另一种方法可以使用 PowerShell 处理此问题,假设您不想将这些命令放在一个文件中并以这种方式调用它:使用 -EncodedCommand
。这使您可以对整个命令或脚本进行 base64 编码,并将其作为单个参数传递到命令行。
所以这是你的原始命令:
(gc c:\temp\temp1.txt) -replace '"', '""' | Out-File -encoding UTF8 c:\temp\temp2.txt
这是对其进行编码的脚本:
$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)
$e
现在包含:
KABnAGMAIABjADoAXAB0AGUAbQBwAFwAdABlAG0AcAAxAC4AdAB4AHQAKQAgAC0AcgBlAHAAbABhAGMAZQAgACcAIgAnACwAIAAnACIAIgAnACAAfAAgAE8AdQB0AC0ARgBpAGwAZQAgAC0AZQBuAGMAbwBkAGkAbgBnACAAVQBUAEYAOAAgAGMAOgBcAHQAZQBtAHAAXAB0AGUAbQBwADIALgB0AHgAdAA=
所以你的新命令行可以是:
powershell.exe -encodedCommand KABnAGMAIABjADoAXAB0AGUAbQBwAFwAdABlAG0AcAAxAC4AdAB4AHQAKQAgAC0AcgBlAHAAbABhAGMAZQAgACcAIgAnACwAIAAnACIAIgAnACAAfAAgAE8AdQB0AC0ARgBpAGwAZQAgAC0AZQBuAGMAbwBkAGkAbgBnACAAVQBUAEYAOAAgAGMAOgBcAHQAZQBtAHAAXAB0AGUAbQBwADIALgB0AHgAdAA=
无需担心转义。
我正在尝试使用 Windows 中的 bat 文件中的 PowerShell 命令 运行 将文件 (temp1.txt) 中的所有双引号替换为两个双引号 7:
powershell -Command "(gc c:\temp\temp1.txt) -replace '\"', '\"\"' | Out-File -encoding UTF8 c:\temp\temp2.txt"
我一直收到错误消息:
'Out-File' is not recognized as an internal or external command.
当我更改命令以将字母 "a" 替换为字母 "b" 时,它工作正常,如下所示:
powershell -Command "(gc c:\temp\temp1.txt) -replace 'a', 'b' | Out-File -encoding UTF8 c:\temp\temp2.txt"
我需要转义双引号,因为整个 powershell -Command
都在双引号字符串中。你如何转义双引号?
PowerShell 的转义符是重音符号。试试这个:
powershell -Command "(gc c:\temp\temp1.txt) -replace `", `"`" | Out-File -encoding UTF8 c:\temp\temp2.txt"
嗯,这里你需要转义命令行上的 "
,在双引号字符串中。根据我的测试,唯一似乎有效的是引用参数内的四双引号 """"
:
powershell.exe -command "echo '""""X""""'"
那么你的命令行应该是:
powershell -Command "(gc c:\temp\temp1.txt) -replace '""""', '""""""""' | Out-File -encoding UTF8 c:\temp\temp2.txt"
还有另一种方法可以使用 PowerShell 处理此问题,假设您不想将这些命令放在一个文件中并以这种方式调用它:使用 -EncodedCommand
。这使您可以对整个命令或脚本进行 base64 编码,并将其作为单个参数传递到命令行。
所以这是你的原始命令:
(gc c:\temp\temp1.txt) -replace '"', '""' | Out-File -encoding UTF8 c:\temp\temp2.txt
这是对其进行编码的脚本:
$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)
$e
现在包含:
KABnAGMAIABjADoAXAB0AGUAbQBwAFwAdABlAG0AcAAxAC4AdAB4AHQAKQAgAC0AcgBlAHAAbABhAGMAZQAgACcAIgAnACwAIAAnACIAIgAnACAAfAAgAE8AdQB0AC0ARgBpAGwAZQAgAC0AZQBuAGMAbwBkAGkAbgBnACAAVQBUAEYAOAAgAGMAOgBcAHQAZQBtAHAAXAB0AGUAbQBwADIALgB0AHgAdAA=
所以你的新命令行可以是:
powershell.exe -encodedCommand KABnAGMAIABjADoAXAB0AGUAbQBwAFwAdABlAG0AcAAxAC4AdAB4AHQAKQAgAC0AcgBlAHAAbABhAGMAZQAgACcAIgAnACwAIAAnACIAIgAnACAAfAAgAE8AdQB0AC0ARgBpAGwAZQAgAC0AZQBuAGMAbwBkAGkAbgBnACAAVQBUAEYAOAAgAGMAOgBcAHQAZQBtAHAAXAB0AGUAbQBwADIALgB0AHgAdAA=
无需担心转义。