批次不等于(不等)运算符

rip*_*234 250 batch-file operators

根据这个,!==!就是不等于字符串操作.尝试一下,我得到:

C:\> if "asdf" !==! "fdas" echo asdf
!==! was unexpected at this time.
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?

Fra*_*ack 471

尝试

if NOT "asdf" == "fdas" echo asdf
Run Code Online (Sandbox Code Playgroud)


dem*_*key 100

请改用NEQ.

if "asdf" NEQ "fdas" echo asdf
Run Code Online (Sandbox Code Playgroud)

  • 这需要打开命令扩展(默认情况下它们在2000+以上,但可以在系统范围内关闭或作为cmd.exe的参数)通常你应该用setlocal打开它们,但对于一个简单的,如果不相同的测试,只要使用"如果不是",它就会回到过去的旧DOS时代 (35认同)

jat*_*rim 29

我知道这已经过时了,但对于那些迟到的人来说,这可能仍然有用.(编辑:更新,因为这仍然得到流量和@Goozak在评论中指出,我对样本的原始分析也是错误的.)

我从你链接中的示例代码中提取了这个:

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
Run Code Online (Sandbox Code Playgroud)

!%1==!只是习惯==用来验证左边的东西,包含你的变量,与右边的东西不同,不是.在!这种情况下只是一个字符占位符.它可能是任何东西.如果%1有内容,那么平等将是假的,如果没有您只是在比较!!,这将是真实的.

!==!不是一个操作员,所以写作"asdf" !==! "fdas"是非常荒谬的.

使用的建议if not "asdf" == "fdas"绝对是要走的路.

  • 这里使用`!`以防'%1`为空,从而导致测试`!==!`,这是真的.您可以使用`%1.==.`(几乎任何字符都可以) - 目的是确保相等测试的两边都有_something_来测试.`!==!`表示法绝对不是**不等号.最好坚持"如果不是......". (4认同)

Dom*_*ger 22

尝试:

if not "asdf" == "fdas" echo asdf
Run Code Online (Sandbox Code Playgroud)

这对我在Windows XP上有效(我得到的错误与您发布的代码相同).


小智 5

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

我找不到任何提及用于字符串比较的特定且等效的不等式操作数(代替 NEQ)的文档。使用 IF NOT == 的解决方案似乎是最合理的方法。我无法立即想到在将 IF NOT == 比较方法应用于字符串时,批处理文件中的操作评估会导致问题或意外行为的情况。

我希望我可以深入了解这两个函数在较低级别上的行为有何不同 - 反汇编单独的批处理文件(使用 NEQ 和 IF NOT ==)是否会提供有关哪些(非官方记录的)本机 API 调用 conhost.exe 的任何线索正在利用?