windows विंडोज बैच फाइलों में NEQ, LSS, GTR, आदि के बराबर प्रतीक




batch-file if-statement (2)

कारण ऑपरेटर > का उपयोग नहीं किया जाता है, क्योंकि शेल स्क्रिप्ट में उनके विशेष अर्थ हैं। आउटपुट को पुनर्निर्देशित करने के लिए > का उपयोग किया जाता है; < इनपुट का पुनर्निर्देशन करने के लिए उपयोग किया जाता है, आदि।

Microsoft से प्रलेखन , निम्नलिखित ऑपरेटरों को सूचीबद्ध करता है:

Operator | Description
EQU      | equal to
NEQ      | not equal to
LSS      | less than
LEQ      | less than or equal to
GTR      | greater than
GEQ      | greater than or equal to

इसके अलावा इस शब्द का इस्तेमाल किसी शर्त को नकारने के लिए not किया जाता है।

मैं प्रतीकों का उपयोग करना चाहता हूं, क्योंकि मुझे लगा कि किसी ने पाठ या संख्या प्रतीकों के लिए कहा था कि पाठ वेरिएंट का उपयोग करने की तुलना में अधिक प्रभावशाली थे।

वे शायद बैश और इसके बड़े ऑपरेटरों की सूची का हवाला दे रहे थे। यह पूर्णांक और स्ट्रिंग ऑपरेंड के लिए अलग-अलग ऑपरेटर प्रदान करता है।

if आदेश का उपयोग करते समय बैच में मैं हमेशा == का उपयोग करता हूं। (उदाहरण के लिए: if "19"=="3" echo My computer doesnt know maths )

दूसरों ( NEQ , NEQ , NEQ , आदि) के सभी के बारे में क्या? NEQ लिए कुछ ऐसा नहीं है != मैं यूनिक्स सोच रहा हूं?

मैं प्रतीकों का उपयोग करना चाहता हूं, क्योंकि मुझे लगता है कि किसी ने पाठ या संख्या प्रतीकों के लिए कहा था कि पाठ वेरिएंट का उपयोग करने की तुलना में अधिक कुशल थे।

किसी भी तरह से, मैं अभी भी जानना चाहूंगा। धन्यवाद।


Windows आंतरिक कमांड IF में डिफ़ॉल्ट रूप से केवल दो ऑपरेटर हैं:

  1. == जो समानता पर दो तर्कों की एक स्ट्रिंग की तुलना करता है, यानी strcmp उपयोग करते हुए strcmp पर सच होने के साथ 0 strcmp
  2. समानता पर स्ट्रिंग तुलना के परिणाम को उल्टा करने के लिए == साथ संयोजन में not , यानी यदि दो तुलना किए गए तार बराबर नहीं हैं तो स्थिति सही है

तो कमांड लाइन:

if "19"=="3" echo My computer doesn't know maths

स्ट्रिंग्स को "19" और "3" साथ चलाता है, जिसका अर्थ है कि बाइट की धाराएं हेक्साडेसिमल 22 31 39 22 00 और 22 33 22 00 । स्ट्रिंग तुलना चलाने से पहले दोहरे उद्धरण नहीं हटाए जाते हैं। वे स्ट्रिंग तुलना में शामिल हैं।

कमांड के लिए एक मदद यदि कमांड प्रॉम्प्ट विंडो में रनिंग पर आउटपुट है if /? कमांड if /? । यह मदद सभी विकल्पों और अतिरिक्त ऑपरेटरों को बताती है, जिनका उपयोग डिफ़ॉल्ट रूप से कमांड एक्सटेंशन सक्षम करने पर किया जा सकता है।

वहाँ विकल्प /I दो तर्कों के मामले की तुलना कर /I है-असंवेदनशील stricmp बजाय stricmp का उपयोग कर।

उदाहरण:

if /I not "%~1" == "/I" echo First argument is neither /i nor /I.

सक्षम कमांड एक्सटेंशन के साथ, अतिरिक्त तुलना ऑपरेटर हैं: EQU , NEQ , LSS , LEQ , GTR , GEQ

कोण कोष्ठक < और > का उपयोग विंडोज कमांड लाइन पर पुनर्निर्देशन ऑपरेटरों के रूप में किया जाता है । तो वे एक IF शर्त पर तुलना ऑपरेटरों के रूप में इस्तेमाल नहीं किया जा सकता है। विस्मयादिबोधक चिह्न भी ! ऑपरेटर के रूप में उपलब्ध नहीं है, क्योंकि इसका मतलब है कि पर्यावरणीय चर विस्तार सक्षम होने पर पर्यावरण चर संदर्भ की शुरुआत / समाप्ति। रन set /? और setlocal /? और endlocal /? विलंबित पर्यावरण चर विस्तार पर विवरण के लिए।

विंडोज कमांड दुभाषिया EQU , NEQ , LSS , LEQ , GTR , GEQ उपयोग पर base 0 ( base स्वत: पता लगाने) के साथ strtol का उपयोग करके 32-बिट पूर्णांक पर हस्ताक्षर किए गए दोनों तर्क तार को बदलने की कोशिश करता है। एक पूर्णांक तुलना की जाती है यदि यह दोनों तर्क तार के लिए सफल है क्योंकि दो तुलना किए गए तार दशमलव संख्या हैं, या हेक्साडेसिमल संख्या 0x शुरू होती हैं या अष्टक संख्या 0 शुरू होती हैं। अन्यथा दो तर्क तार की तुलना फिर से strcmp और तुलना ऑपरेटर को इस फ़ंक्शन के पूर्णांक परिणाम पर लागू किया जाता है।

32-बिट पूर्णांक पर हस्ताक्षर करने के लिए दोनों स्ट्रिंग तर्कों के रूपांतरण को कुछ अतिरिक्त प्रोसेसर निर्देश (कुछ नैनोसेकंड या सीपीयू प्रदर्शन के आधार पर माइक्रोसेकंड) की आवश्यकता होती है। एक पूर्णांक तुलना इसलिए थोड़ी धीमी है, लेकिन वास्तव में ध्यान देने योग्य धीमी नहीं है।

उदाहरण:

if 014 EQU 12 echo Octal number 014 is equal decimal number 12.
if 0x0C EQU 12 echo Hexadecimal number 0C is equal decimal number 12.
if /I 0X0C EQU 014 Hexadecimal number 0C is equal octal number 014.

विकल्प /I को == अलावा एक तुलना ऑपरेटर का उपयोग करने पर ध्यान नहीं दिया जाता है और दोनों तारों में केवल संख्यात्मक अंक होते हैं, जिसमें पहले वर्ण को माइनस साइन के रूप में भी हाइफ़न व्याख्या किया जा सकता है। यह ऊपर की तीसरी पंक्ति से सिद्ध होता है।

यदि EQU , NEQ , LSS , LEQ , GTR , GEQ , या दो तारों में से एक पर दो तर्कों में से एक को दोहरे उद्धरणों में संलग्न किया गया है, तो एक स्ट्रिंग एक पूर्णांक संख्या का प्रतिनिधित्व करने वाला स्ट्रिंग नहीं है, तुलना हमेशा strcmp उपयोग से की strcmp या stricmp /I उपयोग पर निर्भर करता है। strcmp और stricmp दोनों पूर्णांक को परिणाम के रूप में वापस करते हैं जो एक नकारात्मक संख्या, शून्य या एक सकारात्मक संख्या हो सकती है। उपयोग किए गए ऑपरेटर के अनुसार इस पूर्णांक परिणाम की तुलना पूर्णांक मान 0 से की जाती है।

उदाहरण:

if 010 NEQ "10" echo String 010 is not equal string "10".
if "100" LSS "20" echo String "100" is less than string "20".

बाईं ओर के दूसरे वर्ण 1 निचले कोड मान (49 = 0x31) के रूप में दूसरे वर्ण 2 दाईं ओर (50 = 0x32) है, जिसके परिणामस्वरूप strcmp एक नकारात्मक मान लौटता है जिसके परिणामस्वरूप function result LSS 0 सही होता है।

कृपया ध्यान दें कि विंडोज पर्यावरण चर हमेशा स्ट्रिंग के होते हैं और पूर्णांक तुलना या पूर्णांक अंकगणितीय का उपयोग करने पर इसे हमेशा स्ट्रिंग से पूर्णांक में परिवर्तित करने की आवश्यकता होती है।

ज्यादातर मामलों में string1 == string2 का उपयोग करना उचित है। not string1 == string2 बजाय string1 == string2 या not string1 == string2 बजाय string1 EQU string2 या string1 NEQ string2 को दो स्ट्रिंग्स की तुलना करने पर पूर्णांक मानों या stricmp का उपयोग करने के लिए पूर्णांक मानों का प्रतिनिधित्व नहीं करते हैं। अन्यथा EQU या NEQ साथ तार की तुलना करने पर सिर्फ कुछ नैनोसेकंड या माइक्रोसेकंड विंडोज कमांड प्रोसेसर का उपयोग करके व्यर्थ हो जाते हैं, पहले NEQ उपयोग करें जो तुलना करने के लिए दो तारों में से एक को बदलने में विफल रहता है और इसलिए cmd.exe अगले strcmp या stricmp चलाता है क्योंकि यह तुरंत किया जाएगा। ऑपरेटर के उपयोग पर ==

एक और महत्वपूर्ण तथ्य:

तुलना करने वाले EQU , NEQ , LSS , LEQ , GTR , GEQ उपयोग पर पूर्णांक तुलना के बजाय एक स्ट्रिंग में दो तर्क में से एक के मामले में NEQ निष्पादन पर cmd.exe द्वारा संसाधित किया जाता है जिसमें एक अमान्य वर्ण होता है। एक पूर्णांक तुलना फिर भी सीमा स्थिति से बाहर की जाती है जैसे कि एक तर्क -2147483648 से कम है या 2147483647 से अधिक है जैसा कि IF के साथ अजीब परिणामों पर चर्चा की गई है।

वैल्यू रेंज लिमिटेशन को दो मानों की तुलना स्ट्रिंग्स के रूप में करके किया जा सकता है, जिस पर दोनों वैल्यू स्ट्रिंग्स की संख्या समान होती है। यहां यह जानने के लिए एक उदाहरण है कि क्या किसी फ़ाइल में दो या अधिक GiB , यानी फ़ाइल का आकार 2147483648 या अधिक बाइट्स है।

@echo off
setlocal EnableExtensions DisableDelayedExpansion
if "%~1" == "" ( set "FileName=%~f0" ) else set "FileName=%~1"
for %%I in ("%FileName%") do set "FileSize=000000000000000%%~zI"
if "%FileSize:~-16%" GEQ "0000002147483648" (
    echo "%FileName%" is greater or equal 2 GiB.
) else echo "%FileName%" is less than 2 GiB.
endlocal
pause

जिस फ़ाइल का नाम बैच फ़ाइल में दिया गया है, उसका फ़ाइल आकार पर्यावरण चर को सौंपा गया है। शुरुआत में हमेशा कम से कम 15 अतिरिक्त शून्य अंकों के साथ स्ट्रिंग के रूप में देखें।

और इसके बाद 0000002147483648 की तुलना स्ट्रिंग के साथ की जाती है। अंतिम 16 अंकों के साथ स्ट्रिंग 0000002147483648 बाइट्स में 2 GiB का प्रतिनिधित्व करता है। strcmp बाइट द्वारा बराबर लंबाई के दो तारों की तुलना करता है जिसके द्वारा दो तुलना किए गए तार के प्रत्येक बाइट में केवल हेक्साडेसिमल मान 0x30 से 0x39 हो सकता है। strcmp एक ऋणात्मक मान के साथ तुरंत लौटता है यदि बाएं स्ट्रिंग से वर्तमान बाइट दाएं स्ट्रिंग से वर्तमान बाइट से कम है जिसका मतलब है कि फ़ाइल का आकार 2 GiB से कम है। strcmp एक सकारात्मक मान के साथ तुरंत वापस लौटता है यदि बाएं स्ट्रिंग से वर्तमान बाइट दाएं स्ट्रिंग से वर्तमान बाइट से अधिक है जिसका मतलब है कि फ़ाइल का आकार 2 GiB से अधिक है। दो तार पर शून्य के साथ strcmp रिटर्न 100% समान है जिसका अर्थ है कि फ़ाइल का आकार वास्तव में 2 GiB है।

कृपया ध्यान दें कि एक स्ट्रिंग तुलना का उपयोग करते हुए मूल्यों की तुलना करने के लिए आवश्यक है कि दोनों मानों में सटीक परिणाम के लिए समान अंक हो। कम अंकों के साथ मूल्य स्ट्रिंग को 0 की सही मात्रा के साथ तैयार किया जाना चाहिए।





cmd