উইন্ডোজ এনটি-ভিত্তিক কমান্ড লাইনে (বেশিরভাগ এক্সপি বা উচ্চতর জন্য), একটি স্যুইচ কেবল একটি নম্বর দেওয়া হচ্ছে কিনা তা যাচাই করার কোনও উপায় আছে? সংখ্যার উপর নির্ভর করে, আমি এটি কোড x বারের মাধ্যমে লুপ করতে চাই
উইন্ডোজ এনটি-ভিত্তিক কমান্ড লাইনে (বেশিরভাগ এক্সপি বা উচ্চতর জন্য), একটি স্যুইচ কেবল একটি নম্বর দেওয়া হচ্ছে কিনা তা যাচাই করার কোনও উপায় আছে? সংখ্যার উপর নির্ভর করে, আমি এটি কোড 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 এর মতো কোনও প্যারামিটারের সাথে ব্যর্থ হবে ঠিক একটি ম্যাচ করা উচিত। এটি একটি শব্দ মিল না করা উচিত।
09
বা 010
সমস্যা সৃষ্টি করতে পারে। রেগেক্সের জন্য আমার উত্তরটি দেখুন যা অষ্টাল স্বরলিপিটি অস্বীকার করে।
নিম্নলিখিত আমার জন্য খুব ভাল কাজ করে। শূন্য থাকলে বা সংখ্যাটি না থাকলে 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
)
আপনি যদি সংখ্যাটির চারদিকে কোটগুলি মঞ্জুরি দিতে চান তবে 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 হয়।
নিম্নলিখিত সংযোজনগুলির সাথে ববের দুর্দান্ত উত্তরে অনুপ্রাণিত
:::::::::::::::
::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
আপনি যদি কোনও ভেরিয়েবলের সংখ্যাটি যাচাই করতে পারেন:
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
.; ২if %NO_LINES% NEQ %~1 goto ABORT
। যখন দুটি সমান হয় - ভেরিয়েবল বা প্যারামিটার হ'ল সংখ্যাসূচক ।