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

5

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

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

我不断收到这个错误信息:
'Out-File' 不被识别为内部或外部命令。
当我把命令改成用字母“b”替换字母“a”时,它可以正常工作,就像这样:
powershell -Command "(gc c:\temp\temp1.txt) -replace 'a', 'b' | Out-File -encoding UTF8 c:\temp\temp2.txt"

由于整个powershell -Command位于双引号字符串内,因此需要转义双引号。如何转义双引号?

3个回答

15

嗯,在这里您需要在双引号字符串内部转义命令行上的 "。从我的测试中,唯一有效的方法似乎是在引号参数内使用四个双引号 """"

powershell.exe -command "echo '""""X""""'"

那么你的命令行应该是:

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

假设您不想将这些命令放入文件并以那种方式调用,那么使用-EncodedCommand是另一种使用PowerShell处理此问题的方法。这使您可以对整个命令或脚本进行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=

不需要担心需要转义任何内容。


2
我讨厌我刚刚才了解到这个。你知道我花了多少时间来双重和四重转义引号,以及运行和重新运行批处理脚本,试图让一切都恰到好处吗?谢谢。 - gregmac

1

以下是关于IT技术方面的翻译。使用双引号的ASCII代码,即34,避免引用问题。双引号是特殊的cmd.exe字符,管道符也是如此。

powershell "(gc temp1.txt) -replace [char]34,([char]34+[char]34) | set-content temp1.txt"

0
转换为中文:在PowerShell中,转义字符是重音符号。请尝试使用以下内容:
powershell -Command "(gc c:\temp\temp1.txt) -replace `", `"`" | Out-File -encoding UTF8 c:\temp\temp2.txt"

1
@ChrisGciso 这样做是行不通的,因为尽管反引号在 PowerShell 中是转义字符,但你需要从命令提示符中转义 ",以便将其传递给 PowerShell。 - briantist
@ChrisGciso 刚刚再次检查了一下。你是对的。它可以在Cygwin shell和其他*nix shell上运行。我所要做的就是在cmd shell中加倍双引号。 - Emacs User

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接