Trong dòng lệnh dựa trên Windows NT (chủ yếu dành cho XP trở lên), có cách nào để xác minh xem một công tắc được cung cấp chỉ là một số không? Tùy thuộc vào số lượng, tôi muốn nó lặp qua mã x số lần
Trong dòng lệnh dựa trên Windows NT (chủ yếu dành cho XP trở lên), có cách nào để xác minh xem một công tắc được cung cấp chỉ là một số không? Tùy thuộc vào số lượng, tôi muốn nó lặp qua mã x số lần
Câu trả lời:
Đã chỉnh sửa để sửa regex theo nhận xét của debham . Hóa ra việc thêm một khoảng trắng trước đường ống sau tiếng vang sẽ thêm khoảng trắng vào chuỗi đường ống, đó là điều đã phá vỡ điểm bắt đầu / kết thúc của đường khớp trước đó. Regex có thể được cải thiện hơn nữa bằng cách loại bỏ khoảng trắng ở đầu và cuối.
Có findstrlệnh. Nó có thể tìm kiếm các tệp với các biểu thức thông thường, giống như greptrong Linux. Nó cũng có thể tìm kiếm đầu vào đường ống.
@echo off
set param=%1
echo %param%| findstr /r "^[1-9][0-9]*$">nul
if %errorlevel% equ 0 (
echo Valid number
)
Tham số được sử dụng được đặt thành parambiến. Tuy nhiên, không có gì ngăn bạn sử dụng tham số trực tiếp ( %1đối với tham số đầu tiên).
findstrđược sử dụng để tìm kiếm đầu vào đường ống với /rcờ cho regex.
Mẫu:
^ có nghĩa là bắt đầu của dòng.
[0-9]có nghĩa là một chữ số. Có *nghĩa là trước đó lặp lại không hoặc nhiều lần. Vì vậy, [0-9][0-9]*có nghĩa là một chữ số, cộng với không hoặc nhiều chữ số. Nói cách khác, ít nhất một chữ số. Các +một hoặc nhiều lần dường như không được hỗ trợ bởi findstr. Lưu ý rằng [1-9]được sử dụng cho chữ số đầu tiên để không cho phép các số 0 đứng đầu - xem các bình luận.
$ có nghĩa là kết thúc dòng.
Bây giờ, một vòng lặp for theo đợt cho x số lần ... nếu x không phải là số hợp lệ, thì vòng lặp thực sự không chạy chút nào - nó chỉ bị bỏ qua cho dòng tiếp theo. Vì vậy, không cần phải kiểm tra nếu đầu vào là một số hợp lệ!
@echo off
set param=%1
for /l %%a in (1,1,%param%) do (
echo %%a
)
Vòng lặp được thực hiện bằng cách sử dụng for /l, trong đó (x,y,z)có nghĩa là bắt đầu tại x, tăng dần ycho đến khi zđạt được. Và nó được đặt %%athành số / lần lặp hiện tại.
Lưu ý: điều này thực sự thất bại nếu có số 0 đứng đầu, khiến bộ xử lý lệnh coi nó là số bát phân. Xem câu trả lời của dbenham cho một giải pháp tốt hơn.
"this 1 fails"FINDSTR nên thực hiện khớp chính xác. Nó không nên làm một từ phù hợp.
09hoặc 010có thể gây ra vấn đề vì ký hiệu bát phân. Xem câu trả lời của tôi cho regex không tuân theo ký hiệu bát phân.
Sau đây làm việc rất tốt cho tôi. SET /a param=%1+0luôn trả về 0nếu %1trống hoặc không phải là số. Mặt khác, nó cung cấp số đã cho.
SET /a param=%1+0
IF NOT %param%==0 ECHO Valid number
Điều này sẽ phát hiện nếu tham số đầu tiên là số tự nhiên hợp lệ (số nguyên không âm).
@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
)
Nếu bạn muốn cho phép trích dẫn xung quanh số, thì
@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
)
Lưu ý - các số 0 đứng đầu không được phép vì hàng loạt coi chúng là số bát phân, vì vậy giá trị như 09không hợp lệ và 010có giá trị là 8.
Lấy cảm hứng từ câu trả lời tuyệt vời của Bob với các bổ sung sau
:::::::::::::::
::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^>
Vấn đề với điều sau đây là nó luôn trả về 'Số hợp lệ' vì 'if errorlevel 0' luôn luôn đúng do thực tế đó là so sánh '> = 0', không phải là so sánh '== 0'.
@echo off
set param=%1
echo %param%| findstr /r "^[1-9][0-9]*$">nul
if errorlevel 0 (
echo Valid number
)
$ 0,02 của tôi
Bạn có thể xác nhận bất kỳ biến nào nếu số của nó:
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
Tôi không biết tại sao nhưng trên hệ thống của tôi, findstrlệnh không hoạt động. Các lỗi không được thay đổi trên trận đấu hoặc không có trận đấu.
Tôi đã nghĩ ra một phương pháp khác
:: 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.
Đây là một trò chơi sử dụng chức năng này.
@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.. Khi hai số bằng nhau - Biến hoặc tham số là số .