批量不等(不等式)运算符
Posted
技术标签:
【中文标题】批量不等(不等式)运算符【英文标题】:Batch not-equal (inequality) operator 【发布时间】:2010-11-28 03:09:17 【问题描述】:根据this,!==!
是不等于字符串运算符。
试了一下,我明白了:
C:\> if "asdf" !==! "fdas" echo asdf
!==! was unexpected at this time.
我做错了什么?
【问题讨论】:
【参考方案1】:试试
if NOT "asdf" == "fdas" echo asdf
【讨论】:
【参考方案2】:改用 NEQ。
if "asdf" NEQ "fdas" echo asdf
【讨论】:
这需要打开命令扩展(默认情况下它们在 2000+ 上,但可以在系统范围内关闭或作为 cmd.exe 的参数)通常您应该使用 setlocal 打开它们,但是对于一个简单的 if not equal 测试,只需使用“if not”,它可以回到过去的 DOS 时代【参考方案3】:我知道这已经过时了,但这对于那些迟到的人来说可能仍然有用。 (编辑:更新,因为这仍然有流量,@Goozak 在 cmets 中指出我对样本的原始分析也是不正确的。)
我从您链接中的示例代码中提取了这个:
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 并没有因为问题的年龄而锁定回答/评论的能力,所以认为这是完全可以接受的。 这里使用!
,以防%1
为空,从而导致测试!==!
,这是真的。您可以改用 %1.==.
(几乎任何字符都可以)——目的是确保相等测试的双方都有 something 进行测试。 !==!
符号绝对是 NOT 不等号。最好坚持if not ...
。
是的,我通常使用'if X%1 == X goto'来检查脚本是否没有参数。它与 'if "%1" == "" goto something' 相同,但在批处理文件中会失败,因为 "" 计算结果为空,整个句子简化为 'if %1 == goto something'。我更喜欢 X,因为!让你认为它是一个特殊的运算符,而它只是用作一个额外的字符来克服空字符串的问题。批处理文件是 1980 年代的遗物……【参考方案4】:
试试:
if not "asdf" == "fdas" echo asdf
这适用于我在 Windows XP 上(我收到与您发布的代码相同的错误)。
【讨论】:
【参考方案5】:NEQ 通常用于数字,== 通常用于字符串比较。
我找不到任何提及用于字符串比较的特定且等效的不等式操作数(代替 NEQ)的文档。使用 IF NOT == 的解决方案似乎是最合理的方法。当将 IF NOT == 比较方法应用于字符串时,我无法立即想到批处理文件中的操作评估会导致问题或意外行为的情况。
我希望我可以深入了解这两个函数在较低级别上的行为方式有何不同 - 反汇编单独的批处理文件(使用 NEQ 和 IF NOT ==)会提供任何线索,说明哪些(非官方记录的)本机 API 调用conhost.exe 正在使用吗?
【讨论】:
【参考方案6】:我找到的最简单的way 是:
IF %ERRORLEVEL% NEQ 0 Echo An error was found
或
IF %ERRORLEVEL% GRT 0 goto error1
运算符 !==!没有正确的值,这意味着它仅用于知道是否设置了变量。
IF !%1==! GOTO main
【讨论】:
以上是关于批量不等(不等式)运算符的主要内容,如果未能解决你的问题,请参考以下文章