this によると、!==!
は等しくない文字列演算子です。試してみると、
C:\> if "asdf" !==! "fdas" echo asdf
!==! was unexpected at this time.
何がおかしいのですか?
やってみる
if NOT "asdf" == "fdas" echo asdf
代わりにNEQを使用してください。
if "asdf" NEQ "fdas" echo asdf
私はこれがかなり時代遅れであることを知っています、しかしこれはパーティーに遅刻する人たちにとってまだ役に立つかもしれません。 (編集:これはまだトラフィックを得ているので更新され、@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
!%1==!
は、変数を含む左側のものが右側のものと異なることを検証することを目的とした単なる==
の慣用句です。この場合の!
は単なる文字プレースホルダーです。それは何でもありえます。もし%1
が内容を持っていれば同等性は偽になります、そうでなければ!
を!
と比較するだけで真実になります。
!==!
は演算子ではないので、"asdf" !==! "fdas"
を書くことはあまり意味がありません。
if not "asdf" == "fdas"
を使用するという提案は、間違いなく有効な方法です。
試してください:
if not "asdf" == "fdas" echo asdf
それは私にとってWindows XP上で動作します(私はあなたが投稿したコードに対してあなたと同じエラーになります)。
NEQは通常数値に使用され、==は通常文字列の比較に使用されます。
(NEQの代わりに)文字列比較のための具体的かつ同等の不等式オペランドに言及している文書はありません。 IF NOT ==を使用した解決策が最も確実な方法のようです。 IF NOT ==比較メソッドを文字列に適用したときに、バッチファイル内の操作の評価が問題または予期しない動作を引き起こす可能性があるという状況をすぐには考えることができません。
2つの関数が低レベルでどのように異なる動作をするかについての洞察を提供できればと思います - (非公式に文書化されている)ネイティブAPIがconhost.exeを呼び出すという手がかりを提供します。利用している?