88

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

我在尝试:

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
)

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

有任何想法吗?

4

3 回答 3

106

只需在 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
于 2013-02-19T10:49:08.050 回答
43

虽然@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.
于 2014-09-27T21:26:27.113 回答
-5

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

IF "%DevEnvDir%"=="C:\" (
于 2016-11-04T09:13:43.460 回答