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

100

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

我正在尝试:

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

但是它会出现一个错误 "Files was unexpected at this time."

我尝试过:

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

但是它会报错,显示“命令语法不正确”。

有什么想法吗?


根据链接的答案,您可以这样做:if [%DevEnvDir%] == ["C:\..."]。链接:https://dev59.com/4G445IYBdhLWcg3wRoHH#4953226 - Mladen B.
4个回答

118

只需在环境变量周围加上引号(如你已经做过的那样):

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

你比较的字符串没有问题,问题出在你没有在左括号前加空格,这会让它变得混乱。

对我来说没有问题...

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

5
谢谢指点!我犯了一个错误,就是在我的“字符串值”和(之间没有空格。现在可以正常工作了!谢谢。 - dushyantp
8
如果变量已经包含引号,这种方法似乎会失败。例如:if "%1"=="" goto Help如果批处理文件的第一个参数已经带有双引号,则会失败。 - MarioVilas
1
那么不等于的用法是什么? - terwxqian
1
如果不是 "example" == "example" 请参阅 https://learn.microsoft.com/en-us/windows-server/administration/windows-commands/if - AjV Jsy
"bracket" - 你是指括号吗?这是一个方括号:[ - johny why

44

虽然 @ajv-jsy 的答案在大多数情况下都有效,但我遇到了与 @MarioVilas 相同的问题。如果要比较的字符串中包含双引号 ("),变量展开就会出错。

示例:

@echo off
SetLocal

set Lhs="
set Rhs="

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

错误:

echo was unexpected at this time.

解决方法:

启用延迟扩展并使用 ! 代替 %。

@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

使用这种技术,到目前为止我还没有找到破解方法。它适用于空字符串和我测试过的所有符号。

测试:

@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.

@echo off setlocal EnableDelayedExpansion set Lhs="你好" set Rhs="你好" if !Lhs! == "你好" (echo 1相等) :: 用双引号括起来也可以,但似乎是不必要的。 if "!Lhs!" == "你好" echo 相等 timeout 10 endlocal pause - Subham Tripathi
4
如果您希望进行不区分大小写的字符串比较,可以使用 if /I - Carlos P

0

使用子程序的迂回解决方案

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

如果字符串中有双引号,它就无法工作,但是如果比较文件路径,就不应该有双引号。 %~[1-9]波浪线“~”会删除变量周围的双引号,然后在字符串内部加上新的双引号,以防字符串中有空格。但是这个波浪线技巧只适用于传递的变量,因此需要使用子程序。


-6

解决方案是:不要使用空格!

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

5
这是错误的。只要使用引号引用空格,就可以使用空格。问题在于结尾缺少空格:if "%env%"=="xyz"<space>( - jeb

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