Operator batch-tidak sama (ketidaksetaraan)

264

Menurut ini , !==!adalah operator string tidak-sama. Mencoba, saya dapat:

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

Apa yang saya lakukan salah?

ripper234
sumber

Jawaban:

493

Mencoba

if NOT "asdf" == "fdas" echo asdf
Frank Bollack
sumber
105

Gunakan NEQ sebagai gantinya.

if "asdf" NEQ "fdas" echo asdf
demoncodemonkey
sumber
37
ini memerlukan ekstensi perintah untuk dihidupkan (Mereka secara default pada 2000+ tetapi dapat dimatikan lebar sistem atau sebagai parameter ke cmd.exe) Biasanya Anda harus mengaktifkannya dengan setlocal, tetapi untuk tes sederhana jika tidak sama, cukup gunakan "jika tidak", itu akan kembali ke hari
Anders
29

Saya tahu ini sudah ketinggalan zaman, tetapi ini mungkin masih berguna bagi mereka yang datang terlambat ke pesta. (EDIT: diperbarui karena ini masih mendapat lalu lintas dan @ Goozak telah menunjukkan di komentar bahwa analisis asli saya terhadap sampel juga salah.)

Saya menarik ini dari kode contoh di tautan Anda:

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==!hanyalah penggunaan idiomatis yang ==dimaksudkan untuk memverifikasi bahwa benda di sebelah kiri, yang berisi variabel Anda, berbeda dari benda di sebelah kanan, yang tidak. Dalam !hal ini hanyalah placeholder karakter. Itu bisa apa saja. Jika %1memiliki konten, maka kesetaraan akan palsu, jika tidak Anda hanya akan membandingkan !untuk !dan itu akan menjadi kenyataan.

!==!bukan operator, jadi menulis "asdf" !==! "fdas"itu tidak masuk akal.

Saran untuk menggunakan if not "asdf" == "fdas"pasti cara untuk pergi.

jatrim
sumber
Terima kasih jatrim .. Paling pasti bermanfaat bagi mereka yang mencari jawaban, daripada mengajukan pertanyaan lagi. Ini tidak seperti StackExchange mengunci kemampuan untuk menjawab / berkomentar karena usia pertanyaan, jadi anggap ini sepenuhnya dapat diterima.
user66001
4
Yang !digunakan di sini dalam kasus %1kosong, sehingga menghasilkan tes !==!, yang benar. Anda dapat menggunakan %1.==.sebagai gantinya (hampir semua karakter akan melakukan) - tujuannya adalah untuk memastikan bahwa kedua sisi tes kesetaraan memiliki sesuatu untuk diuji. The !==!notasi ini jelas tidak tanda tidak-sama. Lebih baik bertahan dengan if not ....
Goozak
22

Mencoba:

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

Itu bekerja untuk saya di Windows XP (saya mendapatkan kesalahan yang sama seperti Anda untuk kode yang Anda posting).

Dominic Rodger
sumber
4

NEQ biasanya digunakan untuk angka dan == biasanya digunakan untuk perbandingan string.

Saya tidak dapat menemukan dokumentasi yang menyebutkan operand ketidaksetaraan spesifik dan setara untuk perbandingan string (sebagai ganti NEQ). Solusi menggunakan JIKA TIDAK == tampaknya pendekatan yang paling masuk akal. Saya tidak bisa segera memikirkan keadaan di mana evaluasi operasi dalam file batch akan menyebabkan masalah atau perilaku yang tidak terduga ketika menerapkan metode perbandingan JIKA TIDAK == ke string.

Saya berharap saya dapat menawarkan wawasan tentang bagaimana dua fungsi berperilaku berbeda pada tingkat yang lebih rendah - akan membongkar file batch yang terpisah (yang menggunakan NEQ dan JIKA TIDAK ==) menawarkan petunjuk apa pun dalam hal API asli (didokumentasikan secara tidak resmi) panggilan API asli conhost.exe Apakah memanfaatkan?

Paul
sumber