批处理不等于(不等)运算符

319

根据这个!==!是不等字符串运算符。测试结果为:

C:\> if "asdf" !==! "fdas" echo asdf
!==! was unexpected at this time.

我做错了什么?

6个回答

597

尝试

if NOT "asdf" == "fdas" echo asdf

133

使用 NEQ 代替。

if "asdf" NEQ "fdas" echo asdf

49
这需要开启命令扩展(在2000年及以上版本中默认已启用,但可以作为系统范围或cmd.exe参数关闭)。通常应该使用setlocal打开它们,但对于简单的非相等测试,只需使用"if not",它回到了好旧的DOS时代。 - Anders
对于2023年或之后的人来说,任何机器运行Windows Me或更低版本都非常罕见,但你仍然需要确保它至少能运行2000版本。这被称为向后兼容性 :) - stysan
对于2023年或之后的人来说,任何机器运行Windows Me或更低版本都非常罕见,但你仍然需要确保它至少能运行2000版本。这被称为向后兼容性 :) - undefined

34
我从您链接中的示例代码中提取了这个:
IF !%1==! GOTO VIEWDATA
REM  IF NO COMMAND-LINE ARG...
FIND "%1" C:\BOZO\BOOKLIST.TXT
GOTO EXIT0
REM  PRINT LINE WITH STRING MATCH, THEN EXIT.

:VIEWDATA
TYPE C:\BOZO\BOOKLIST.TXT | MORE
REM  SHOW ENTIRE FILE, 1 PAGE AT A TIME.

:EXIT0

!%1==! 是一种惯用的使用 == 的方式,旨在验证左侧包含变量的内容与右侧不包含变量的内容是否不同。在这种情况下,! 只是一个字符占位符��它可以是任何东西。如果 %1 有内容,则相等性将为假,如果没有,则只需比较 !!,并且结果将为真。

!==! 不是运算符,因此编写 "asdf" !==! "fdas" 是相当荒谬的。

建议使用 if not "asdf" == "fdas"


感谢 jatrim。对于那些正在寻找答案而不是再次提问的人来说,这肯定是有帮助的。StackExchange并没有因为问题的年龄而锁定回答/评论的能力,所以我认为这是完全可以接受的。 - user66001
4
在这里使用!是为了防止 %1 为空,从而导致测试 !==! 成立。您可以使用 %1.==. 替代(几乎任何字符都可以),目的是确保等式测试的两侧都有“某些东西”可供测试。!==! 表示不等于符号,最好还是使用 if not ... - Goozak
1
是的,我通常使用“if X%1 == X goto somewhere”来检查脚本是否没有参数。它与“if”%1“==”“”goto somewhere相同,只是在批处理文件中会失败,因为“”评估为空,并且整个句子缩小为“if%1 == goto somewhere”。我更喜欢X,因为!使您认为它是一个特殊运算符,而实际上它只是用作额外字符以克服空字符串的问题。批处理文件是20世纪80年代的遗物... - Jouni Aro

27

尝试一下:

if not "asdf" == "fdas" echo asdf

我在Windows XP上测试过,这对我有效(使用你所发布的代码时,我遇到了与你相同的错误)。


7

NEQ通常用于数字比较,而==通常用于字符串比较。

我没有找到任何文件说明针对字符串比较有特定且等效的不等操作符(代替NEQ)。使用IF NOT ==的解决方案似乎是最可靠的方法。我无法立即想到在批处理文件中评估操作时会出现问题或意外行为的情况,当将IF NOT ==比较方法应用于字符串时。

我希望能够了解这两个函数在低级别上的差异如何表现-分解使用NEQ和IF NOT ==的单独批处理文件是否提供任何线索,以确定conhost.exe正在利用哪些(非官方记录)本地API调用?


3
我发现最简单的方法是:

通过这个链接来实现:

IF %ERRORLEVEL% NEQ 0 Echo An error was found

或者

IF %ERRORLEVEL% GRT 0 goto error1

运算符 !==! 没有正确的值,这意味着它只用于判断变量是否已设置。

IF !%1==! GOTO main

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