बैच फ़ाइल में केवल संख्यात्मक इनपुट के लिए जाँच करें


10

Windows NT- आधारित कमांड लाइन में (ज्यादातर XP या उच्चतर के लिए), क्या यह सत्यापित करने का एक तरीका है कि क्या स्विच प्रदान किया जा रहा है केवल एक संख्या है? संख्या के आधार पर, मैं चाहता हूं कि यह कोड x संख्या के माध्यम से लूप हो


1
व्यक्तिगत रूप से, मैं इस उत्तर के लिए विधि पसंद करता हूं: सुनिश्चित करें कि उपयोगकर्ता ने पूर्णांक में प्रवेश किया है । वह सब काम करने के लिए कमांड प्रोसेसर का उपयोग करें । आप इसे न्यूनतम समाधान के रूप में 2 x लाइनों तक सरल कर सकते हैं: 1 set /a NO_LINES=%~1.; 2 if %NO_LINES% NEQ %~1 goto ABORT.। जब दो समान होते हैं - चर या पैरामीटर संख्यात्मक होता है
होगा

जवाबों:


18

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


नहीं है 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वर्तमान संख्या / पुनरावृत्ति पर सेट होता है।

नोट: यह वास्तव में विफल रहता है यदि एक अग्रणी शून्य है, जिससे कमांड प्रोसेसर इसे एक अष्टाधारी संख्या के रूप में मानता है। बेहतर समाधान के लिए डेंभम का जवाब देखें ।


बहुत बढ़िया स्पष्टीकरण! और उपयोग करने में आसान
कैनेडियन ल्यूक

1
जैसा कि लिखा गया है, यह समाधान एक पैरामीटर के साथ विफल हो जाएगा जैसे "this 1 fails"कि FINDSTR को एक सटीक मिलान करना चाहिए। इसे वर्ड मैच नहीं करना चाहिए।
डेबनहम

@ सदनहम धन्यवाद। मैंने पहले लाइन मिलान की शुरुआत / समाप्ति की कोशिश की, लेकिन एक अतिरिक्त स्थान से गुजरने के कारण गूंज में विफल रहा। अब तय हो गया।
बॉब

@CanadianLuke आप संपादन पर एक नज़र डालना चाह सकते हैं।
बॉब

ऑक्टल नोटेशन की वजह से मान 09या 010समस्या हो सकती है। रेक्स के लिए मेरा जवाब देखें जो ऑक्टल नोटेशन को अस्वीकार करता है।
डेबनहम

8

निम्नलिखित मेरे लिए बहुत अच्छी तरह से काम करता है। SET /a param=%1+0हमेशा रिटर्न 0अगर %1खाली या संख्यात्मक नहीं है। अन्यथा, यह दी गई संख्या प्रदान करता है।

SET /a param=%1+0
IF NOT %param%==0 ECHO Valid number

4
यह विफल हो जाएगा यदि पैरामीटर = 0. इसके अलावा "1 + 1" जैसे पैरामीटर को एक संख्या के रूप में माना जाएगा, जो आवश्यकताओं के आधार पर समस्याएं पैदा कर सकता है।
डेबनहम

7

यह पता लगाएगा कि क्या पहला पैरामीटर वैध प्राकृतिक संख्या (गैर-नकारात्मक पूर्णांक) है।

@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 है।


3

निम्नलिखित जोड़ के साथ बॉब के उत्कृष्ट उत्तर से प्रेरित

  • त्रुटि तर्क को ठीक करें
  • एक DoWork लूप / उप को लागू करें जो संख्या के माध्यम से पुनरावृत्त करता है और कुछ अंकगणित करता है

:::::::::::::::
::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


वूप्स ... मेरी भी त्रुटि को ठीक किया। ऑटोमैटिक फॉल-थ्रू के बजाय प्रत्यक्ष संख्यात्मक तुलना।
बॉब



0

मुझे पता नहीं क्यों लेकिन मेरे सिस्टम पर 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
)

-1
: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
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.