281

According to this, !==! is the not-equal string operator. Trying it, I get:

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

What am I doing wrong?

Dave Jarvis
  • 28,853
  • 37
  • 164
  • 291
ripper234
  • 202,011
  • 255
  • 600
  • 878

5 Answers5

526

Try

if NOT "asdf" == "fdas" echo asdf
Uwe Keim
  • 36,867
  • 50
  • 163
  • 268
Frank Bollack
  • 22,354
  • 3
  • 45
  • 56
116

Use NEQ instead.

if "asdf" NEQ "fdas" echo asdf
demoncodemonkey
  • 11,027
  • 10
  • 53
  • 95
  • 46
    this requires command extensions to be turned on (They are by default on 2000+ but can be turned off system wide or as a parameter to cmd.exe) Normally you should turn them on with setlocal, but for a simple if not equal test, just use "if not", it goes back to the good old DOS days – Anders Sep 14 '09 at 20:27
31

I know this is quite out of date, but this might still be useful for those coming late to the party. (EDIT: updated since this still gets traffic and @Goozak has pointed out in the comments that my original analysis of the sample was incorrect as well.)

I pulled this from the example code in your link:

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==! is simply an idiomatic use of == intended to verify that the thing on the left, that contains your variable, is different from the thing on the right, that does not. The ! in this case is just a character placeholder. It could be anything. If %1 has content, then the equality will be false, if it does not you'll just be comparing ! to ! and it will be true.

!==! is not an operator, so writing "asdf" !==! "fdas" is pretty nonsensical.

The suggestion to use if not "asdf" == "fdas" is definitely the way to go.

jatrim
  • 659
  • 6
  • 10
  • Thanks [jatrim](http://stackoverflow.com/users/866045).. Most definitely helpful for those searching for an answer, rather than asking the question again. It isn't like StackExchange locks off the ability to answer/comment due to age of questions, so think this is fully acceptable. – user66001 Jun 19 '13 at 16:07
  • 4
    The `!` are used here in case `%1` is empty, thus resulting in the test `!==!`, which is true. You could use `%1.==.` instead (almost any character would do) — the purpose being to make sure that both sides of the equality test has _something_ to test. The `!==!` notation is definitely **NOT** a not-equal sign. Better stick with `if not ...`. – Goozak Sep 06 '13 at 14:22
25

Try:

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

That works for me on Windows XP (I get the same error as you for the code you posted).

Dominic Rodger
  • 90,548
  • 30
  • 192
  • 207
5

NEQ is usually used for numbers and == is typically used for string comparison.

I cannot find any documentation that mentions a specific and equivalent inequality operand for string comparison (in place of NEQ). The solution using IF NOT == seems the most sound approach. I can't immediately think of a circumstance in which the evaluation of operations in a batch file would cause an issue or unexpected behavior when applying the IF NOT == comparison method to strings.

I wish I could offer insight into how the two functions behave differently on a lower level - would disassembling separate batch files (that use NEQ and IF NOT ==) offer any clues in terms of which (unofficially documented) native API calls conhost.exe is utilizing?

Paul
  • 51
  • 1
  • 1