3

変数内の引用符をエスケープして、別の変数と比較するにはどうすればよいですか。

例: スクリプトは「"test.exe" の出力は OK です」と出力します (引用符を囲む必要はありません)。

バッチ スクリプトでは、出力をバッチ スクリプトの変数に保存し、保存した変数と比較したいと考えています。

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"

しかし、運が悪い。

何か案は?

4

3 に答える 3

6

コードには 3 つの問題があります。

問題#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-compare を変更する必要があります。正しい方法は次のとおりです。

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
于 2012-09-28T19:03:30.320 に答える
4

遅延展開を使用すると、引用符で囲まれているかどうかに関係なく、これを回避できるようです(cおよびd引用符はありません)。

@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
于 2012-09-28T16:32:23.750 に答える
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 )
于 2012-09-28T18:24:31.197 に答える