在批处理脚本变量中转义引号

时间:2012-09-28 15:12:45

标签: windows escaping batch-file

如何在变量中转义引号以与另一个变量进行比较。

示例:脚本输出“test.exe”的输出“正常”(没有周围的引号)

在批处理脚本中,我将输出保存在我的批处理脚本中的变量中,然后想要与保存的变量进行比较。

set ouputTest1 = "The output of "test.exe" is OK"

test.exe -p 75 > temp.txt
set /p TESTOUTPUT=< temp.txt
if %TESTOUTPUT% == %ouputTest1%

问题在于outputTest1变量和字符串中的引号。我尝试用这样的双引号:

set ouputTest1 = "The output of ""test.exe"" is OK"

但没有运气。

有什么想法吗?

3 个答案:

答案 0 :(得分:5)

您的代码有三个问题:

问题#1:

脚本行set ouputTest1 = "The output of "test.exe" is OK"不会创建名为outputTest1的变量;相反,它会创建一个名为outputTest1<space>的变量。这就是%outputTest1%始终为空的原因。

问题#2:

在“set”语句中,在等号被分配后所有 - 包括空格和外引号。在您的情况下,变量的内容最终为<space>"The output of "test.exe" is OK"

问题#3:

最后,您需要更改IF比较。正确的方法如下:

set "ouputTest1=The output of "test.exe" is OK"

test.exe -p 75 > temp.txt
set /p TESTOUTPUT=< temp.txt
if "%TESTOUTPUT%" == "%ouputTest1%" echo Equal

答案 1 :(得分:4)

使用延迟扩展似乎可以绕过此问题,无论是否包含引号(cd均未加引号):

@echo off
setlocal disabledelayedexpansion

set a="The output of "test.exe" is OK"
set b="The output of "test.exe" is OK"

set "c=The output of "test.exe" is NOT OK"
set "d=The output of "test.exe" is NOT OK"

setlocal enabledelayedexpansion
if !a!==!b! echo a and b match!
if !c!==!d! echo c and d match!

endlocal

答案 2 :(得分:1)

wmz提出的答案似乎是一个可靠的答案,但我认为我仍然可以提供这种替代方案,以供考虑。

为了进行比较,您可以将比较字符串写入另一个文件并比较文件,而不是将输出(即temp.txt)读入变量。如下所示:

echo The output of "test.exe" is OK>temp-expected.txt
fc temp.txt temp.expected.txt >NUL
if "%ERRORLEVEL%"=="0" ( echo YAY ) else ( echo BOO )