दिलचस्प पोस्ट
आर gotcha: संयोजन के संयोजन के लिए तार्किक और ऑपरेटर & नहीं है && Custom.css ने 32.0.1700.76 एम Google Chrome अपडेट में काम करना बंद कर दिया है मैं विंडोज़ में बाल प्रक्रियाओं को स्वचालित रूप से कैसे नष्ट कर सकता हूं? दिए गए फ़ोल्डर में किसी विशिष्ट एक्सटेंशन के साथ फाइलों की सूची कैसे प्राप्त करें? समय चाल संकलन में सी + + टाइप पंजीकरण आईपैड मिनी स्क्रीन आकार के साथ लेनदेन Spritekit में एक ऊर्ध्वाधर स्क्रॉलिंग मेनू कैसे बनाएं? ईएल समर्थन अधिभारित तरीकों क्या है? किसी ऑब्जेक्ट को डिवाइस पर कॉपी करें? फोन नंबर मान्यता के लिए एक व्यापक regex सी # में मैं एक COM (सीरियल) पोर्ट जो कि पहले से ही खुला है, सुन सकता था? कोणीय डॉलर संसाधन हटाए जाने के लिए express.js सर्वर को शरीर नहीं भेजता मैं पायथन में एक्सएमएल को कैसे पार्स कर सकता हूँ? बूटस्ट्रैप 3 में भी एक संवेदनशील छवि कैसे बनाई जाती है जावास्क्रिप्ट आइडरपर (माउस कर्सर के नीचे पिक्सेल का रंग बताएं)

विंडोज बैच फ़ाइल अगर विफलता – 3000000000000000 40000000000 के बराबर कैसे हो सकती है?

अगर मैं 2 बड़ी संख्याओं की तुलना करने का प्रयास करता हूं तो गलत जवाब देता है IF

उदाहरण के लिए, यह सरल बैच फ़ाइल

@echo off setlocal set n1=30000000000000 set n2=40000000000 if %n1% gtr %n2% echo %n1% is greater than %n2% if %n1% lss %n2% echo %n1% is less than %n2% if %n1% equ %n2% echo %n1% is equal to %n2% 

पैदा करता है

 30000000000000 is equal to 40000000000 

क्या चल रहा है, और मैं इसे कैसे ठीक कर सकता हूं?

Solutions Collecting From Web of "विंडोज बैच फ़ाइल अगर विफलता – 3000000000000000 40000000000 के बराबर कैसे हो सकती है?"

यदि IF की तुलना के दोनों किनारों का कड़ाई से दशमलव अंक बना रहे हैं, तो IF दोनों पक्षों की व्याख्या संख्याओं के रूप में होगी। यह वह है जो सही ढंग से निर्धारित करने के लिए सक्षम है कि 10 9 से अधिक है। यदि आपके पास कोई अंक अंक नहीं है, तो यदि स्ट्रिंग तुलना होती है उदाहरण के लिए, "10" "9" से भी कम है क्योंकि उद्धरण अंक नहीं हैं, और 1 प्रकार 9 से कम है।

इसका कारण यह सवाल विफल हो जाता है क्योंकि CMD.EXE 2147483647 से अधिक संख्याओं को संसाधित नहीं कर सकता है। IF में कोई अजीब डिजाइन विवाद 2147483647 से 2147483647 के बराबर किसी भी बड़े आकार के व्यवहार करता है।

यदि आप बड़ी संख्या की स्ट्रिंग तुलना करना चाहते हैं, तो समाधान आसान है। आपको बस शर्त की दोनों तरफ 1 या अधिक गैर अंकों वाले अक्षर जोड़ना होगा। निम्नलिखित स्क्रिप्ट –

 @echo off setlocal set n1=30000000000000 set n2=40000000000 if "%n1%" gtr "%n2%" echo "%n1%" is greater than "%n2%" if "%n1%" lss "%n2%" echo "%n1%" is less than "%n2%" if "%n1%" equ "%n2%" echo "%n1%" is equal to "%n2%" 

सही स्ट्रिंग तुलना परिणाम उत्पन्न करता है

 "30000000000000" is less than "40000000000" 

लेकिन ज्यादातर मामलों में, ऐसा नहीं है जो वांछित है

यदि आप एक संख्यात्मक तुलना करना चाहते हैं, तो प्रक्रिया थोड़ा अधिक शामिल है। आपको नंबर को एक स्ट्रिंग में कनवर्ट करना होगा जो एक नंबर के रूप में ठीक तरह से सॉर्ट करेगी। यह शून्य के साथ संख्यात्मक स्ट्रिंग को पूर्वनिर्धारित करके पूरा किया जाता है जिस तरह से दोनों संख्यात्मक स्ट्रिंग्स को समान चौड़ाई प्रदान करता है। सरलतम समाधान आपको अंकों की अधिकतम संख्या निर्धारित करने के लिए है, जो आपको समर्थन देने की आवश्यकता है – इस उदाहरण के लिए 15 कहते हैं। इसलिए आप प्रत्येक मान को 15 शून्य के साथ प्रीफ़ेन्स करते हैं, और उसके बाद एक सबस्ट्रिंग ऑपरेशन का उपयोग करके केवल अधिकतम-अधिकतम 15 वर्णों को संरक्षित करते हैं। आपको दोनों पक्षों के लिए एक गैर-अंकों को जोड़ना होगा जैसे पहले से फिर से उद्धरण चिह्नों को अच्छी तरह से काम करना है।

यह स्क्रिप्ट –

 @echo off setlocal set n1=30000000000000 set n2=40000000000 call :padNum n1 call :padNum n2 if "%n1%" gtr "%n2%" echo %n1% is greater than %n2% if "%n1%" lss "%n2%" echo %n1% is less than %n2% if "%n1%" equ "%n2%" echo %n1% is equal to %n2% exit /b :padNum setlocal enableDelayedExpansion set "n=000000000000000!%~1!" set "n=!n:~-15!" endlocal & set "%~1=%n%" exit /b 

पैदा करता है –

 030000000000000 is greater than 000040000000000 

ध्यान दें कि रिक्त स्थान के साथ छोड़ा गया उपसर्ग केवल शून्य के साथ ही काम करता है।

जब आप निम्न का उपयोग करना चाहते हैं तो आप अग्रणी शून्य को बाद में हटा सकते हैं (या प्रमुख स्थान निकालने के लिए अनुकूलित कर सकते हैं)

 for /f "tokens=* delims=0" %%A in ("%n1%") do set "n1=%%A" if not defined n1 set "n1=0" 

आम तौर पर हम बैच फ़ाइलों में बड़ी संख्या से निपटने नहीं करते हैं। लेकिन अगर हम हार्ड डिस्क पर खाली स्थान को देखते हैं, तो वे आसानी से फसल कर सकते हैं। टेराबाइट डिस्क ड्राइव अब अपेक्षाकृत सस्ती हैं इस तरह मैं पहली बार बड़ी संख्या की तुलना में https://stackoverflow.com/a/9099542/1012053 पर चला गया

मैंने अपने उदाहरण में 15 अंक का समर्थन करना चुना क्योंकि यह लगभग 99 9 टेराबाइट के बराबर है मुझे लगता है कि इससे पहले कि हमारे पास डिस्क ड्राइव की तुलना में बड़ा है, इससे पहले कि यह थोड़ी देर हो। (किंतु कौन जानता है!)

संपादित करें – मेरा वर्णन है कि कैसे संख्याओं को पार्स करता है जानबूझकर अति सरलीकृत है यदि वास्तव में नकारात्मक संख्याओं का समर्थन करता है, साथ ही हेक्स और अष्टक संकेतन अधिक विस्तृत व्याख्या के लिए सीएमडी.एक्सई के पार्स नंबर के नियमों के लिए नियम देखें।