ตัวดำเนินการแบทช์ไม่เท่ากัน (ไม่เท่ากัน)


263

ตามนี้ , !==!เป็นผู้ประกอบการสตริงที่ไม่เท่ากัน ลองเลยฉันจะได้รับ:

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

ผมทำอะไรผิดหรือเปล่า?

คำตอบ:



105

ใช้ NEQ แทน

if "asdf" NEQ "fdas" echo asdf

37
สิ่งนี้ต้องการส่วนขยายคำสั่งที่จะเปิดใช้งาน (โดยค่าเริ่มต้นคือ 2000+ แต่สามารถปิดได้ทั้งระบบหรือเป็นพารามิเตอร์ของ cmd.exe) โดยปกติแล้วคุณควรเปิดใช้งานด้วย setlocal แต่สำหรับการทดสอบอย่างง่ายไม่เท่ากัน เพียงแค่ใช้ "หากไม่ได้" มันจะไปกลับไปที่ DOS วันเก่าดี
เดส

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

!%1==!เป็นการใช้สำนวนที่==ตั้งใจจะตรวจสอบว่าสิ่งที่อยู่ทางซ้ายซึ่งมีตัวแปรของคุณนั้นแตกต่างจากสิ่งที่อยู่ทางขวานั่นไม่ใช่ !ในกรณีนี้เป็นเพียงตัวละครตัวยึด มันอาจเป็นอะไรก็ได้ หาก%1มีเนื้อหาที่แล้วความเท่าเทียมกันจะเป็นเท็จถ้ามันไม่ได้คุณจะเพิ่งจะเปรียบเทียบ!ไป!และมันจะเป็นความจริง

!==!ไม่ใช่ตัวดำเนินการดังนั้นการเขียน"asdf" !==! "fdas"จึงค่อนข้างไร้สาระ

คำแนะนำในการใช้if not "asdf" == "fdas"เป็นวิธีที่จะไป


ขอบคุณjatrim .. มีประโยชน์มากที่สุดสำหรับผู้ที่ค้นหาคำตอบแทนที่จะถามคำถามอีกครั้ง มันไม่เหมือนกับ StackExchange ที่ปิดความสามารถในการตอบ / ความคิดเห็นเนื่องจากอายุของคำถามดังนั้นจึงคิดว่านี่เป็นที่ยอมรับอย่างสมบูรณ์
user66001

4
!ถูกนำมาใช้ในกรณีที่นี่%1เป็นที่ว่างเปล่าจึงทำให้เกิดการในการทดสอบ!==!ที่เป็นจริง คุณสามารถใช้%1.==.แทน (เกือบทุกตัวละครจะทำ) - จุดประสงค์เพื่อให้แน่ใจว่าทั้งสองด้านของการทดสอบความเท่าเทียมกันมีบางสิ่งที่จะทดสอบ !==!โน้ตแน่นอนไม่ได้เป็นสัญญาณที่ไม่เท่ากัน if not ...ติดที่ดีขึ้นด้วย
Goozak


4

มักจะใช้ NEQ สำหรับตัวเลขและโดยทั่วไปแล้ว == จะใช้สำหรับการเปรียบเทียบสตริง

ฉันไม่พบเอกสารใด ๆ ที่กล่าวถึงตัวถูกดำเนินการที่ไม่เท่ากันและเทียบเท่าสำหรับการเปรียบเทียบสตริง (แทนที่ NEQ) การแก้ปัญหาโดยใช้ IF NOT == ดูเหมือนจะเป็นแนวทางที่ดีที่สุด ฉันไม่สามารถคิดได้ทันทีถึงสถานการณ์ที่การประเมินผลการดำเนินงานในไฟล์แบทช์จะทำให้เกิดปัญหาหรือพฤติกรรมที่ไม่คาดคิดเมื่อใช้ IF NOT == วิธีเปรียบเทียบกับสตริง

ฉันหวังว่าฉันสามารถเสนอข้อมูลเชิงลึกเกี่ยวกับวิธีที่ทั้งสองฟังก์ชันทำงานแตกต่างกันในระดับที่ต่ำกว่า - จะแยกส่วนแบตช์ไฟล์แยกต่างหาก (ที่ใช้ NEQ และหากไม่ ==) เสนอเบาะแสใด ๆ กำลังใช้งานอยู่?

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.