Windows NT- आधारित कमांड लाइन में (ज्यादातर XP या उच्चतर के लिए), क्या यह सत्यापित करने का एक तरीका है कि क्या स्विच प्रदान किया जा रहा है केवल एक संख्या है? संख्या के आधार पर, मैं चाहता हूं कि यह कोड x संख्या के माध्यम से लूप हो
Windows NT- आधारित कमांड लाइन में (ज्यादातर XP या उच्चतर के लिए), क्या यह सत्यापित करने का एक तरीका है कि क्या स्विच प्रदान किया जा रहा है केवल एक संख्या है? संख्या के आधार पर, मैं चाहता हूं कि यह कोड x संख्या के माध्यम से लूप हो
जवाबों:
डेगम की टिप्पणी के अनुसार रेगेक्स को ठीक करने के लिए संपादित किया गया । पता चलता है कि गूंज के बाद पाइप से पहले एक जगह जोड़ने से पाइप स्ट्रिंग में एक स्थान जुड़ जाता है, जो कि पहले से मेल खाते हुए लाइन के प्रारंभ / अंत को तोड़ दिया था। शुरुआत और अंत में व्हाट्सएप को त्याग कर रेगेक्स को और बेहतर बनाया जा सकता है।
नहीं है findstrआदेश। यह grepलिनक्स में बहुत पसंद रेगुलर एक्सप्रेशन वाली फाइल्स सर्च कर सकता है । यह पाइप किए गए इनपुट को भी खोज सकता है।
@echo off
set param=%1
echo %param%| findstr /r "^[1-9][0-9]*$">nul
if %errorlevel% equ 0 (
echo Valid number
)
उपयोग किए गए पैरामीटर को paramचर में सेट किया गया है। हालांकि, पैरामीटर को सीधे ( %1पहले पैरामेटर के लिए) उपयोग करने से आपको कुछ भी नहीं रोकना है ।
findstr/rरेगेक्स के लिए ध्वज के साथ पाइप किए गए इनपुट को खोजने के लिए उपयोग किया जाता है ।
पैटर्न:
^ लाइन की शुरुआत का मतलब है।
[0-9]एक अंक का मतलब है। *पिछले दोहराया शून्य या अधिक बार का मतलब है। तो [0-9][0-9]*इसका मतलब है एक अंक, प्लस शून्य या अधिक अंक। दूसरे शब्दों में, कम से कम एक अंक। +एक या अधिक बार द्वारा समर्थित होना प्रतीत नहीं होता है findstr। ध्यान दें कि [1-9]पहले अंक के लिए अग्रणी शून्य को हटाने के लिए उपयोग किया जाता है - टिप्पणियां देखें।
$ लाइन के अंत का मतलब है।
अब, x संख्या के लिए बैच में एक लूप के लिए ... यदि x एक वैध संख्या नहीं है, तो लूप वास्तव में बिल्कुल नहीं चलता है - यह सिर्फ अगली पंक्ति के लिए छोड़ दिया जाता है। तो यह जांचने की कोई आवश्यकता नहीं है कि क्या इनपुट एक वैध संख्या है!
@echo off
set param=%1
for /l %%a in (1,1,%param%) do (
echo %%a
)
लूप का उपयोग किया जाता है for /l, जहां (x,y,z)इसका मतलब है कि प्रारंभ करें x, yतब तक वेतन वृद्धि करें z। और यह %%aवर्तमान संख्या / पुनरावृत्ति पर सेट होता है।
नोट: यह वास्तव में विफल रहता है यदि एक अग्रणी शून्य है, जिससे कमांड प्रोसेसर इसे एक अष्टाधारी संख्या के रूप में मानता है। बेहतर समाधान के लिए डेंभम का जवाब देखें ।
"this 1 fails"कि FINDSTR को एक सटीक मिलान करना चाहिए। इसे वर्ड मैच नहीं करना चाहिए।
निम्नलिखित मेरे लिए बहुत अच्छी तरह से काम करता है। SET /a param=%1+0हमेशा रिटर्न 0अगर %1खाली या संख्यात्मक नहीं है। अन्यथा, यह दी गई संख्या प्रदान करता है।
SET /a param=%1+0
IF NOT %param%==0 ECHO Valid number
यह पता लगाएगा कि क्या पहला पैरामीटर वैध प्राकृतिक संख्या (गैर-नकारात्मक पूर्णांक) है।
@echo off
echo %1|findstr /xr "[1-9][0-9]* 0" >nul && (
echo %1 is a valid number
) || (
echo %1 is NOT a valid number
)
यदि आप संख्या के आसपास उद्धरण की अनुमति देना चाहते हैं, तो
@echo off
echo "%~1"|findstr /xr /c:\"[1-9][0-9]*\" /c:\"0\" >nul && (
echo %~1 is a valid number
) || (
echo %~1 is NOT a valid number
)
नोट - अग्रणी शून्य को अस्वीकृत कर दिया जाता है क्योंकि बैच उन्हें अष्टक के रूप में मानता है, इसलिए ऐसा मान 09अमान्य है, और 010इसका मान 8 है।
निम्नलिखित जोड़ के साथ बॉब के उत्कृष्ट उत्तर से प्रेरित
:::::::::::::::
::CountTo.bat
:::::::::::::::
@echo off
::This is the number to test
if "%1"=="" goto :Usage
set param=%1
set matchPattern="^[1-9][0-9]*$"
::test if param matches matchPattern, quietly
:: (redirect stdout to nul, and stderr to stdout)
echo %param%|findstr /r %matchPattern%>nul 2>&1
:: check for errorlevel 1 or higher. errorlevel 0 is handled as
:: an unchecked fall-through
if errorlevel 1 goto :MyHandleErrorCode
::Success (errorlevel ! >= 1) so proceed.
echo %param% is a valid number
echo (matches findstr /r %param% %matchPattern%)
echo findstr returned errorlevel 0
::any other code that the batch file needs to do goes here
echo.
echo Iterating from 1 to %param%
echo.
for /l %%i in (1,1,%param%) do call :DoWork %%i
::anything else,
:: .
:: .
::cleanup
:: .
:: .
::exit the batch file here, skipping embedded subroutines
goto :eof
:::::::::::::::::::::::::
:: Main work subroutine
:::::::::::::::::::::::::
:DoWork
set /a offset = %1 - 1
set /a square = %1 * %1
echo item %1
echo offset: %offset%
echo square: %square%
echo.
goto :eof
:::::::::::::::::::::::
:: Error handler code
:::::::::::::::::::::::
:MyHandleErrorCode
echo.
echo CountTo %param%
echo %param% is not a valid number
echo (does not match findstr /r %param% %matchPattern%)
echo findstr returned errorlevel ^>= 1
:: error code doesn't have a goto :eof, we want to drop through to :Usage
::::::::
:Usage
::::::::
echo.
echo Usage:
echo. CountTo ^<someNumber^>
निम्नलिखित के साथ समस्या यह है कि यह हमेशा 'वैध संख्या' लौटाता है क्योंकि 'if errorlevel 0' इस तथ्य के कारण हमेशा सही होता है कि यह '> = 0' की तुलना है, न कि '== 0' की तुलना करें।
@echo off
set param=%1
echo %param%| findstr /r "^[1-9][0-9]*$">nul
if errorlevel 0 (
echo Valid number
)
मेरी $ .02
आप किसी भी चर को मान्य कर सकते हैं यदि उसकी संख्या:
SET "var="&for /f "delims=0123456789" %i in ("%a") do set var=%i
if defined var (echo."NIC">nul) else (echo."number")
set xx=33
echo %xx%
SET /a %xx%+0 2>nul >nul && echo all Digits
set xx=3x3
echo %xx%
SET /a %xx%+0 2>nul >nul || echo No Digits
मुझे पता नहीं क्यों लेकिन मेरे सिस्टम पर findstrकमांड काम नहीं करता था। मैच या किसी मैच में त्रुटिलेवल नहीं बदला जा रहा था।
मैं हालांकि एक और तरीका लेकर आया था
:: Look for all digits. Parse the string and use all the digits as
:: delimiters. If the entire string is a digit then we will get an empty
:: parse value.
SET ALL_DIGITS=0
FOR /F "tokens=* delims=0123456789" %%a IN ("%VALUE%") DO (
IF "[%%a]" EQU "[]" SET ALL_DIGITS=1
)
IF %ALL_DIGITS% EQU 0 (
ECHO ERROR: %VALUE% is not all numbers
)
:main
set /p input=text
if %input% equ 0 goto valid
set /a inputval="%input%"*1
if %inputval% equ 0 goto invalid
goto valid
:invalid
echo Input is not an integer.
:valid
echo Input is an integer.
यहाँ एक खेल है जो इस फ़ंक्शन का उपयोग करता है।
@echo off
:main
set /a guessmin=1
set /a guessmax=100
set /a guessrand=%random% %%100 +1
echo.
:check
if %guessmin% equ %guessmax% goto fail
set /p input=- Pick a number %guessmin% - %guessmax%:
set /a inputval="%input%"*1
if %inputval% equ 0 goto invalid
if %inputval% gtr %guessmax% goto invalid
if %inputval% lss %guessmin% goto invalid
if %inputval% gtr %guessrand% goto high
if %inputval% lss %guessrand% goto low
if %inputval% equ %guessrand% goto mid
:invalid
echo Please enter a valid number.
echo.
goto check
:high
echo Your guess was too high.
echo.
set /a guessmax=%inputval%-1
goto check
:low
echo Your guess was too low.
echo.
set /a guessmin=%inputval%+1
goto check
:mid
echo Your guess was correct. The game will now reset.
set /p input=- Press enter to play again.
cls
goto main
:fail
echo You actually managed to lose because there is only
echo one number remaining. That number is %guessrand%.
set /p input=- Press enter to lose again.
cls
goto main
set /a NO_LINES=%~1.; 2if %NO_LINES% NEQ %~1 goto ABORT.। जब दो समान होते हैं - चर या पैरामीटर संख्यात्मक होता है ।