दिलचस्प पोस्ट
सर्विसलेट <लोड-ऑन-स्टार्टअप> वैल्यू क्या दर्शाता है IOS info.plist फ़ाइल के अंदर एक स्ट्रिंग को स्थानीयकृत कैसे करें? ऑनलाइन होने पर WebView लोड वेबसाइट, ऑफ़लाइन होने पर स्थानीय फ़ाइल लोड करें रिसाइकिलवेव एडेप्टर संलग्न नहीं; लेआउट लंघन जब रूट एल कैपिटन (रूटलेस अक्षम) पर ऑपरेशन की अनुमति नहीं है पीआईपी के साथ विशिष्ट पैकेज संस्करणों को स्थापित करना क्या मैं प्रतिबिंब के माध्यम से सी # में निजी रीडोनली फ़ील्ड बदल सकता हूँ? SQL क्वेरी: नवीनतम एन को छोड़कर तालिका से सभी अभिलेख हटाएं? Mysql में group_concat के समान ओरेकल में कोई फ़ंक्शन है? मूल डीजेएओ व्यवस्थापक टेम्पलेट कैसे ओवरराइड और विस्तारित करें? लार्जल एलोक्वेन्ट में "से ()" फ़ंक्शन का उपयोग करके विशिष्ट कॉलम प्राप्त करें कैसे मैन्युअल आलसी एक मॉड्यूल लोड करने के लिए? LAN नेटवर्क पर किसी अन्य कंप्यूटर से स्थानीयहोस्ट (एक्सएमपीपी) तक पहुंच – कैसे करें? पीएचपी से शेल स्क्रिप्ट को कैसे कॉल करें जिसे एसयूडीओ की ज़रूरत है? IE में किसी भी व्यक्ति को HTML पर सेट नहीं किया जा सकता

बैच फ़ाइल में स्ट्रिंग की लंबाई कैसे प्राप्त करें?

बैच फ़ाइल में स्ट्रिंग की लंबाई प्राप्त करने का आसान तरीका नहीं है। उदाहरण के लिए,

SET MY_STRING=abcdefg SET /A MY_STRING_LEN=??? 

मुझे MY_STRING की स्ट्रिंग की लंबाई कैसे MY_STRING ?

बोनस अंक यदि स्ट्रिंग की लंबाई फ़ंक्शन, सभी संभव वर्णों को स्ट्रिंग्स में शामिल करते हैं जिसमें एस्केप वर्ण शामिल हैं, जैसे: !%^^()^!

वेब के समाधान से एकत्रित समाधान "बैच फ़ाइल में स्ट्रिंग की लंबाई कैसे प्राप्त करें?"

चूंकि स्ट्रिंग की लंबाई के लिए फ़ंक्शन में कोई निर्मित नहीं है, आप अपने स्वयं के फ़ंक्शन को ऐसा लिख ​​सकते हैं:

 @echo off setlocal set "myString=abcdef!%%^^()^!" call :strlen result myString echo %result% goto :eof :strlen <resultVar> <stringVar> ( setlocal EnableDelayedExpansion set "s=!%~2!#" set "len=0" for %%P in (4096 2048 1024 512 256 128 64 32 16 8 4 2 1) do ( if "!s:~%%P,1!" NEQ "" ( set /a "len+=%%P" set "s=!s:~%%P!" ) ) ) ( endlocal set "%~1=%len%" exit /b ) 

इस फंक्शन की हमेशा एक साधारण स्ट्रेलन फ़ंक्शन की बजाय 13 loops की आवश्यकता होती है, जो स्ट्रेलन-लोप्स की आवश्यकता होती है।
यह सभी वर्णों को संभालता है।

आप इसे दो पंक्तियों में पूरी तरह से एक बैच फ़ाइल में, फ़ाइल में स्ट्रिंग लिखकर और फिर फ़ाइल की लंबाई प्राप्त कर सकते हैं। आपको अंत में जोड़ा गया स्वचालित सीआर + एलएफ के लिए सिर्फ दो बाइट्स को घटाया जाना है।

मान लें कि आपकी स्ट्रिंग strvar नामक एक चर में है:

 ECHO %strvar%> tempfile.txt FOR %%? IN (tempfile.txt) DO ( SET /A strlength=%%~z? - 2 ) 

स्ट्रिंग की लंबाई अब एक वेरिएबल में होती है जिसे strlength कहा जाता है।

थोड़ा अधिक विस्तार में:

  • FOR %%? IN (filename) DO ( ... FOR %%? IN (filename) DO ( ... : एक फ़ाइल के बारे में जानकारी प्राप्त करता है
  • SET /A [variable]=[expression] : संख्यात्मक रूप से अभिव्यक्ति का मूल्यांकन करें
  • %%~z? : फ़ाइल की लंबाई प्राप्त करने के लिए विशेष अभिव्यक्ति

पूरे आदेश को एक पंक्ति में मैश करने के लिए:

 ECHO %strvar%>x&FOR %%? IN (x) DO SET /A strlength=%%~z? - 2&del x 

मैं जेब का स्वीकृत उत्तर पसंद करता हूं – यह सबसे तेज़ ज्ञात समाधान है और जिसकी मैं अपनी लिपियों में उपयोग करता हूं (वास्तव में कुछ अतिरिक्त ऑप्टिमाइज़ेशन हैं जिन्हें डोजट्स के बारे में बैंडिग किया गया है, लेकिन मुझे नहीं लगता कि वे इसके लायक हैं)

लेकिन नए कुशल एल्गोरिदम के साथ आने के लिए मजेदार है। यहां एक नया एल्गोरिथ्म है जो FINDSTR / O विकल्प का उपयोग करता है:

 @echo off setlocal set "test=Hello world!" :: Echo the length of TEST call :strLen test :: Store the length of TEST in LEN call :strLen test len echo len=%len% exit /b :strLen strVar [rtnVar] setlocal disableDelayedExpansion set len=0 if defined %~1 for /f "delims=:" %%N in ( '"(cmd /v:on /c echo(!%~1!&echo()|findstr /o ^^"' ) do set /a "len=%%N-3" endlocal & if "%~2" neq "" (set %~2=%len%) else echo %len% exit /b 

कोड 3 का अवतरण करता है क्योंकि पार्सर कमांड को कुंद करता है और सीएमडी / वी / सी से पहले एक स्थान जोड़ता है। इसे उपयोग करके रोका जा सकता है (echo(!%~1!^^^)


उन लोगों के लिए, जो सबसे तेज गति से संभव प्रदर्शन करना चाहते हैं, जेब के उत्तर को तर्क के साथ एक बैच "मैक्रो" के रूप में प्रयोग के लिए अपनाया जा सकता है । यह एक उन्नत बैच तकनीक है, जो डॉसटिप्स पर बिखरी हुई है, जो कॉल करने की स्वाभाविक धीमी प्रक्रिया को समाप्त करती है: सबरॉउटिन आप यहां बैच मैक्रोज के पीछे अवधारणाओं पर और पृष्ठभूमि पा सकते हैं , लेकिन यह लिंक अधिक आदिम, कम वांछनीय वाक्यविन्यास का उपयोग करता है।

नीचे एक अनुकूलित @स्ट्रान मैक्रो है, उदाहरण के साथ मैक्रो और: सबस्ट्रैटन उपयोग के बीच अंतर दिखाने के साथ-साथ प्रदर्शन में अंतर भी।

 @echo off setlocal disableDelayedExpansion :: -------- Begin macro definitions ---------- set ^"LF=^ %= This creates a variable containing a single linefeed (0x0A) character =% ^" :: Define %\n% to effectively issue a newline with line continuation set ^"\n=^^^%LF%%LF%^%LF%%LF%^^" :: @strLen StrVar [RtnVar] :: :: Computes the length of string in variable StrVar :: and stores the result in variable RtnVar. :: If RtnVar is is not specified, then prints the length to stdout. :: set @strLen=for %%. in (1 2) do if %%.==2 (%\n% for /f "tokens=1,2 delims=, " %%1 in ("!argv!") do ( endlocal%\n% set "s=A!%%~1!"%\n% set "len=0"%\n% for %%P in (4096 2048 1024 512 256 128 64 32 16 8 4 2 1) do (%\n% if "!s:~%%P,1!" neq "" (%\n% set /a "len+=%%P"%\n% set "s=!s:~%%P!"%\n% )%\n% )%\n% for %%V in (!len!) do endlocal^&if "%%~2" neq "" (set "%%~2=%%V") else echo %%V%\n% )%\n% ) else setlocal enableDelayedExpansion^&setlocal^&set argv=, :: -------- End macro definitions ---------- :: Print out definition of macro set @strLen :: Demonstrate usage set "testString=this has a length of 23" echo( echo Testing %%@strLen%% testString %@strLen% testString echo( echo Testing call :strLen testString call :strLen testString echo( echo Testing %%@strLen%% testString rtn set "rtn=" %@strLen% testString rtn echo rtn=%rtn% echo( echo Testing call :strLen testString rtn set "rtn=" call :strLen testString rtn echo rtn=%rtn% echo( echo Measuring %%@strLen%% time: set "t0=%time%" for /l %%N in (1 1 1000) do %@strlen% testString testLength set "t1=%time%" call :printTime echo( echo Measuring CALL :strLen time: set "t0=%time%" for /l %%N in (1 1 1000) do call :strLen testString testLength set "t1=%time%" call :printTime exit /b :strlen StrVar [RtnVar] :: :: Computes the length of string in variable StrVar :: and stores the result in variable RtnVar. :: If RtnVar is is not specified, then prints the length to stdout. :: ( setlocal EnableDelayedExpansion set "s=A!%~1!" set "len=0" for %%P in (4096 2048 1024 512 256 128 64 32 16 8 4 2 1) do ( if "!s:~%%P,1!" neq "" ( set /a "len+=%%P" set "s=!s:~%%P!" ) ) ) ( endlocal if "%~2" equ "" (echo %len%) else set "%~2=%len%" exit /b ) :printTime setlocal for /f "tokens=1-4 delims=:.," %%a in ("%t0: =0%") do set /a "t0=(((1%%a*60)+1%%b)*60+1%%c)*100+1%%d-36610100 for /f "tokens=1-4 delims=:.," %%a in ("%t1: =0%") do set /a "t1=(((1%%a*60)+1%%b)*60+1%%c)*100+1%%d-36610100 set /a tm=t1-t0 if %tm% lss 0 set /a tm+=24*60*60*100 echo %tm:~0,-2%.%tm:~-2% msec exit /b 

– नमूना आउटपुट –

 @strLen=for %. in (1 2) do if %.==2 ( for /f "tokens=1,2 delims=, " %1 in ("!argv!") do ( endlocal set "s=A!%~1!" set "len=0" for %P in (4096 2048 1024 512 256 128 64 32 16 8 4 2 1) do ( if "!s:~%P,1!" neq "" ( set /a "len+=%P" set "s=!s:~%P!" ) ) for %V in (!len!) do endlocal&if "%~2" neq "" (set "%~2=%V") else echo %V ) ) else setlocal enableDelayedExpansion&setlocal&set argv=, Testing %@strLen% testString 23 Testing call :strLen testString 23 Testing %@strLen% testString rtn rtn=23 Testing call :strLen testString rtn rtn=23 Measuring %@strLen% time: 1.93 msec Measuring CALL :strLen time: 7.08 msec 

पहली कुछ पंक्तियां बस प्रदर्शित करने के लिए हैं: स्ट्रेल फ़ंक्शन

 @echo off set "strToMeasure=This is a string" call :strLen strToMeasure strlen echo.String is %strlen% characters long exit /b :strLen setlocal enabledelayedexpansion :strLen_Loop if not "!%1:~%len%!"=="" set /A len+=1 & goto :strLen_Loop (endlocal & set %2=%len%) goto :eof 

बेशक, यह जेब द्वारा प्रदान किए गए "13 लूप" संस्करण पर काफी कुशल नहीं है लेकिन यह समझना आसान है, और आपका 3GHz कंप्यूटर एक दूसरे के एक छोटे अंश में कुछ हजार पुनरावृत्तियों के माध्यम से पर्ची कर सकता है

हां, ज़ाहिर है कि वीबीएससीपीटी (या पावरशेल्ड) का इस्तेमाल करना आसान तरीका है।

 WScript.Echo Len( WScript.Arguments(0) ) 

इसे strlen.vbs और कमांड लाइन पर सहेजें

 c:\test> cscript //nologo strlen.vbs "abcd" 

परिणाम पर कब्जा करने के लिए लूप का उपयोग करें (या आपके स्क्रिप्टिंग कार्य के लिए पूरी तरह से vbscript का उपयोग करें)

निश्चित रूप से बैच का उपयोग करके बोझिल कामकाज बनाने के लिए धड़कता है और वीबीएसक्रिप्ट प्रत्येक विंडोज वितरण (और बाद में पावरशेल्ड) के साथ उपलब्ध होने के बाद इसका उपयोग करने के लिए कोई बहाना नहीं है।

मुझे jmh_gr के दो लाइन दृष्टिकोण पसंद हैं I

यह एकल अंक संख्याओं के साथ काम नहीं करेगा जब तक कि आप रीडायरेप से पहले कमांड के भाग के आसपास नहीं डालते। चूंकि 1> एक विशेष आदेश है "इको ऑन ऑन" फ़ाइल पर रीडायरेक्ट किया जाएगा।

इस उदाहरण को एकल अंक संख्याओं का ध्यान रखना चाहिए, लेकिन अन्य विशेष अक्षरों जैसे कि < जो स्ट्रिंग में हो सकता है

 (ECHO %strvar%)> tempfile.txt 

यदि आप Windows Vista + पर हैं, तो इस पावरहेल विधि को आज़माएं:

 For /F %%L in ('Powershell $Env:MY_STRING.Length') do ( Set MY_STRING_LEN=%%L ) 

या वैकल्पिक रूप से:

 Powershell $Env:MY_STRING.Length > %Temp%\TmpFile.txt Set /p MY_STRING_LEN = < %Temp%\TmpFile.txt Del %Temp%\TmpFile.txt 

मैं Windows 7 x 64 पर हूं और यह मेरे लिए काम कर रहा है

बस कुछ पंक्तियों में, एक स्ट्रिंग की लंबाई की गणना करने के लिए बस एक और बैच स्क्रिप्ट यह सबसे तेज नहीं हो सकता है, लेकिन यह बहुत छोटा है सबराउटिन ": लेन" दूसरे पैरामीटर में लंबाई लौटाता है पहला पैरामीटर वास्तविक स्ट्रिंग का विश्लेषण किया जा रहा है। कृपया ध्यान दें – विशेष पात्रों को बचाना होगा, यह बैच फ़ाइल में किसी भी स्ट्रिंग के साथ मामला है।

 @echo off setlocal call :len "Sample text" a echo The string has %a% characters. endlocal goto :eof :len <string> <length_variable> - note: string must be quoted because it may have spaces setlocal enabledelayedexpansion&set l=0&set str=%~1 :len_loop set x=!str:~%l%,1!&if not defined x (endlocal&set "%~2=%l%"&goto :eof) set /al=%l%+1&goto :len_loop 
 @echo off & setlocal EnableDelayedExpansion set Var=finding the length of strings for /l %%A in (0,1,10000) do if not "%Var%"=="!Var:~0,%%A!" (set /a Length+=1) else (echo !Length! & pause & exit /b) 

var को उस पर सेट करें, जिसे आप इसे की लंबाई खोजना चाहते हैं या इसे सेट करने के लिए / p var = बदल दें ताकि उपयोगकर्ता इसे इनपुट कर सके इसे भविष्य में संदर्भ के लिए डालना।

 @echo off :: warning doesn't like * ( in mystring setlocal enabledelayedexpansion set mystring=this is my string to be counted forty one call :getsize %mystring% echo count=%count% of "%mystring%" set mystring=this is my string to be counted call :getsize %mystring% echo count=%count% of "%mystring%" set mystring=this is my string call :getsize %mystring% echo count=%count% of "%mystring%" echo. pause goto :eof :: Get length of mystring line ######### subroutine getsize ######## :getsize set count=0 for /l %%n in (0,1,2000) do ( set chars= set chars=!mystring:~%%n! if defined chars set /a count+=1 ) goto :eof :: ############## end of subroutine getsize ######################## 

मैं यह कह कर प्रस्तावना चाहता हूं कि मुझे लिखित कोड / स्क्रिप्ट / आदि के बारे में अधिक जानकारी नहीं है। लेकिन मैंने सोचा कि मैं एक समाधान का हिस्सा हूं जो मुझे लगता है अधिकांश प्रतिक्रियाएं यहां थोड़े मेरे सिर पर चली गईं, इसलिए मुझे यह जानकर उत्सुक था कि मैंने जो लिखा है वह तुलनीय है।

 @echo off set stringLength=0 call:stringEater "It counts most characters" echo %stringLength% echo.&pause&goto:eof :stringEater set var=%~1 :subString set n=%var:~0,1% if "%n%"=="" ( goto:eof ) else if "%n%"==" " ( set /a stringLength=%stringLength%+1 ) else ( set /a stringLength=%stringLength%+1 ) set var=%var:~1,1000% if "%var%"=="" ( goto:eof ) else ( goto subString ) goto:eof 

बस अल्टिमेट समाधान मिला:

 set "MYSTRING=abcdef!%%^^()^!" (echo "%MYSTRING%" & echo.) | findstr /O . | more +1 | (set /P RESULT= & call exit /B %%RESULT%%) set /A STRLENGTH=%ERRORLEVEL%-5 echo string "%MYSTRING%" length = %STRLENGTH% 

आउटपुट है:

 string "abcdef!%^^()^!" length = 14 

यह भागने के पात्रों को संभालता है, ऊपर से अधिकतर परिमाण के सरलता का एक क्रम है, और इसमें कोई छोर नहीं हैं, जादुई संख्याएं, विलंबित विकल्प, अस्थायी फ़ाइलें आदि।

यदि बाहरी बैच स्क्रिप्ट का उपयोग करें (मतलब है कि मैन्युअल रूप से सांत्वना देने के लिए कमांड डालते हैं), %%RESULT%% कुंजी %RESULT% साथ बदलें

यदि आवश्यक हो, तो %ERRORLEVEL% variable को किसी भी NOP आदेश का उपयोग करके FALSE सेट किया जा सकता है, जैसे echo. >nul echo. >nul