ব্যাচ ফাইলে কেবল সংখ্যাগত ইনপুট পরীক্ষা করে দেখুন


10

উইন্ডোজ এনটি-ভিত্তিক কমান্ড লাইনে (বেশিরভাগ এক্সপি বা উচ্চতর জন্য), একটি স্যুইচ কেবল একটি নম্বর দেওয়া হচ্ছে কিনা তা যাচাই করার কোনও উপায় আছে? সংখ্যার উপর নির্ভর করে, আমি এটি কোড x বারের মাধ্যমে লুপ করতে চাই


1
ব্যক্তিগতভাবে, আমি এই উত্তরের জন্য পদ্ধতিটি পছন্দ করি: নিশ্চিত হয়ে নিন যে ব্যবহারকারী কোনও পূর্ণসংখ্যা প্রবেশ করেছে । কমান্ড প্রসেসরটি সমস্ত কাজ করতে ব্যবহার করুন । আপনি এটিকে ন্যূনতম সমাধান হিসাবে 2 এক্স লাইনে সহজ করতে পারেন: 1 set /a NO_LINES=%~1.; ২ 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 এর মতো কোনও প্যারামিটারের সাথে ব্যর্থ হবে ঠিক একটি ম্যাচ করা উচিত। এটি একটি শব্দ মিল না করা উচিত।
dbenham

@ ডিবেনহ্যাম ধন্যবাদ আমি এর আগে লাইন মিলের শুরু / শেষের চেষ্টা করেছি, তবে অতিরিক্ত স্থান প্রতিধ্বনির কারণে ব্যর্থ হয়েছে। এখনই স্থির।
বব

@ কানাডিয়ানলুক আপনি সম্পাদনাটি একবার দেখে নিতে পারেন
বব

অক্টাল নোটেশনের কারণে একটি মান 09বা 010সমস্যা সৃষ্টি করতে পারে। রেগেক্সের জন্য আমার উত্তরটি দেখুন যা অষ্টাল স্বরলিপিটি অস্বীকার করে।
dbenham

8

নিম্নলিখিত আমার জন্য খুব ভাল কাজ করে। শূন্য থাকলে বা সংখ্যাটি না থাকলে SET /a param=%1+0সর্বদা ফিরে আসে । অন্যথায়, এটি প্রদত্ত নম্বর সরবরাহ করে।0%1

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

4
প্যারামিটার = 0 থাকলে এটি ব্যর্থ হবে এছাড়াও "1 + 1" এর মতো একটি পরামিতিটিকে একটি সংখ্যা হিসাবে বিবেচনা করবে, যা প্রয়োজনীয়তার উপর নির্ভর করে সমস্যা তৈরি করতে পারে।
dbenham

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
)

আপনি যদি সংখ্যাটির চারদিকে কোটগুলি মঞ্জুরি দিতে চান তবে then

@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

নিম্নলিখিত সংযোজনগুলির সাথে ববের দুর্দান্ত উত্তরে অনুপ্রাণিত

  • ত্রুটিযুক্ত লজিকটি ঠিক করুন
  • একটি ডুওর্ক লুপ / ​​সাব প্রয়োগ করুন যা সংখ্যার মাধ্যমে পুনরাবৃত্তি করে এবং কিছু গাণিতিক করে

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

নীচের সমস্যাটি হ'ল এটি সর্বদা 'বৈধ সংখ্যা' ফেরত দেয় কারণ 'যদি ত্রুটিযুক্ত 0' সর্বদা সত্য হয় তবে এটি '> = 0' তুলনা হয়, একটি '== 0' তুলনা করে না।

@echo off

set param=%1

echo %param%| findstr /r "^[1-9][0-9]*$">nul

if errorlevel 0 (
    echo Valid number
)

আমার 0 .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
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.