批处理文件中的字符串比较

如何比较在批处理文件中获得空格和特殊字符的字符串?

我在努力:

if %DevEnvDir% == "C:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\IDE\"(
echo VS2010
)

但是它给出了一个错误“ Files was Italy at this time”

我试过:

if "%DevEnvDir%" == "C:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\IDE\"(
echo VS2010
)

但是它给出了一个错误“该命令的语法是不正确的。”

有什么想法吗?

351492 次浏览

Just put quotes around the Environment variable (as you have already done):

if "%DevEnvDir%" == "C:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\IDE\"

The strings you are comparing are fine, the problem is the way you put the opening bracket without a space. That is confusing it.

Works for me...

C:\if "%gtk_basepath%" == "C:\Program Files\GtkSharp\2.12\" (echo yes)
yes

While @ajv-jsy's answer works most of the time, I had the same problem as @MarioVilas. If one of the strings to be compared contains a double quote ("), the variable expansion throws an error.

Example:

@echo off
SetLocal


set Lhs="
set Rhs="


if "%Lhs%" == "%Rhs%" echo Equal

Error:

echo was unexpected at this time.

Solution:

Enable delayed expansion and use ! instead of %.

@echo off
SetLocal EnableDelayedExpansion


set Lhs="
set Rhs="


if !Lhs! == !Rhs! echo Equal


:: Surrounding with double quotes also works but appears (is?) unnecessary.
if "!Lhs!" == "!Rhs!" echo Equal

I have not been able to break it so far using this technique. It works with empty strings and all the symbols I threw at it.

Test:

@echo off
SetLocal EnableDelayedExpansion


:: Test empty string
set Lhs=
set Rhs=
echo Lhs: !Lhs! & echo Rhs: !Rhs!
if !Lhs! == !Rhs! (echo Equal) else (echo Not Equal)
echo.


:: Test symbols
set Lhs= \ / : * ? " ' < > | %% ^^ ` ~ @ # $ [ ] & ( ) + - _ =
set Rhs= \ / : * ? " ' < > | %% ^^ ` ~ @ # $ [ ] & ( ) + - _ =
echo Lhs: !Lhs! & echo Rhs: !Rhs!
if !Lhs! == !Rhs! (echo Equal) else (echo Not Equal)
echo.

The solution is DO NOT USE SPACES!

IF "%DevEnvDir%"=="C:\" (

A roundabout solution use a subroutine

CALL :Comparator %var1% %var2% <- or the string you want to compare
IF %retVal%==1 (
do stuff
) ELSE (
do other things
)


GOTO :eof


:Comparator
IF "%~1" == "%~2" (set retVal=1) ELSE (set retVal=0)
GOTO :eof

It won't work if there is double-quotes inside the strings though, but if you compare file paths, there shouldn't be. %~[1-9] the tilde '~' removes double quotes around the variable, and then you put new ones around them if the strings has spaces inside. The tilde trick only works with passed variable though, hence the subroutine.