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


75

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

我在尝试:

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

但是它给出了一个错误“文件此时是意外的”。

我试过了:

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

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

有任何想法吗?


从链接的答案来看,您可以这样做if [%DevEnvDir%] == ["C:\..."]。链接:stackoverflow.com/a/4953226/2428861
MladenB。19年

Answers:


94

只需将引号括在Environment变量周围即可(就像您所做的那样):
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

4
谢谢提示!!我犯的错误是,“字符串值”和(之间没有空格
。-

7
如果变量已包含引号,则这似乎失败。例如:如果“%1” ==“”,则批处理文件的第一个参数周围已经包含双引号时,goto帮助将失败。
MarioVilas 2013年

41

虽然@ 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 =“ hello”如果不是!请设置Rhs =“ hello”!==“ hello”(回声1等于)::也可以用双引号引起来,但看起来(是)是不必要的。如果是“!Lhs!” ==“ hello” echo相等的超时10
结束本地

3
if /I如果您希望进行不区分大小写的字符串比较,则可以使用
Carlos P

-4

解决的办法是不要使用空格!

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

3
错了 您可以使用空格,只要引用它们即可。问题是末尾缺少空间if "%env%"=="xyz"<space>(
jeb
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.