Sprawdź, czy w pliku wsadowym są tylko dane liczbowe
10
Czy w wierszu poleceń systemu Windows NT (głównie dla systemu XP lub nowszego) istnieje sposób na sprawdzenie, czy podany przełącznik jest tylko liczbą? W zależności od liczby chcę, aby liczba razy przechodziła przez kod x
Osobiście wolę metodę w tej odpowiedzi dla: Upewnij się, że użytkownik wprowadził liczbę całkowitą . Użyj procesora poleceń, aby wykonać całą tę pracę. Możesz to uprościć do 2 x linii jako minimalnego rozwiązania: 1 set /a NO_LINES=%~1.; 2 if %NO_LINES% NEQ %~1 goto ABORT. Gdy dwa są równe - zmienna lub parametr jest liczbowy .
będzie
Odpowiedzi:
18
Edytowane, aby naprawić regex zgodnie z komentarzem debham . Okazuje się, że dodanie spacji przed potokiem po echu dodaje spację do łańcucha potokowego, co wcześniej przerywało dopasowanie początku / końca linii. Wyrażenie regularne można jeszcze ulepszyć, odrzucając białe znaki na początku i na końcu.
Jest findstrpolecenie. Może wyszukiwać pliki z wyrażeniami regularnymi, podobnie jak grepw Linuksie. Może także przeszukiwać dane wejściowe.
@echo off
set param=%1
echo %param%| findstr /r "^[1-9][0-9]*$">nul
if %errorlevel% equ 0 (
echo Valid number
)
Wyjaśnienie
Używany parametr jest ustawiany w paramzmiennej. Jednak nic nie stoi %1na przeszkodzie, abyś używał parametru bezpośrednio ( dla pierwszego parametru).
findstrsłuży do wyszukiwania danych wejściowych w potoku za pomocą /rflagi pod kątem wyrażenia regularnego.
Wzór:
^ oznacza początek linii.
[0-9]oznacza cyfrę. Te *środki poprzedniego powtórzony zero lub więcej razy. Więc [0-9][0-9]*oznacza jedną cyfrę, plus zero lub więcej cyfr. Innymi słowy, co najmniej jedna cyfra. Wydaje się, że +jeden lub więcej razy nie jest obsługiwany findstr. Zauważ, że [1-9]pierwsza cyfra służy do niedopuszczenia zer wiodących - patrz komentarze.
$ oznacza koniec linii.
Teraz pętla for we wsadach x razy ... jeśli x nie jest prawidłową liczbą, pętla faktycznie nie działa wcale - jest po prostu pomijana w następnym wierszu. Nie trzeba więc sprawdzać, czy wprowadzony numer jest prawidłowy!
@echo off
set param=%1
for /l %%a in (1,1,%param%) do (
echo %%a
)
Pętla jest wykonywana przy użyciu for /l, gdzie (x,y,z)oznacza początek x, przyrost o, yaż do zosiągnięcia. I ustawia %%abieżącą liczbę / iterację.
Uwaga: to faktycznie kończy się niepowodzeniem, jeśli na początku jest zero, co powoduje, że procesor poleceń traktuje go jako liczbę ósemkową. Zobacz odpowiedź dbenham na lepsze rozwiązanie.
Jak napisano, to rozwiązanie zawiedzie z parametrem takim jak "this 1 fails"FINDSTR powinien dokładnie dopasować. Nie powinno pasować do słowa.
dbenham
@dbenham Thanks. Próbowałem wcześniej dopasować początek / koniec wiersza, ale to nie powiodło się, ponieważ echo przeszło dodatkową spację. Naprawiono teraz.
Bob
@CanadianLuke Możesz rzucić okiem na zmianę.
Bob
Wartość 09lub 010może powodować problemy z powodu notacji ósemkowej. Zobacz moją odpowiedź na wyrażenie regularne, które nie pozwala na notację ósemkową.
dbenham,
8
Poniższe działa dla mnie bardzo dobrze. SET /a param=%1+0zawsze zwraca, 0jeśli %1jest pusta lub nie numeryczna. W przeciwnym razie podaje podaną liczbę.
SET /a param=%1+0
IF NOT %param%==0 ECHO Valid number
Nie powiedzie się, jeśli parametr = 0. Będzie również traktował parametr taki jak „1 + 1” jako liczbę, co może powodować problemy w zależności od wymagań.
dbenham
7
Wykryje to, czy pierwszy parametr jest prawidłową liczbą naturalną (nieujemna liczba całkowita).
@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
)
Jeśli chcesz dopuścić cytaty wokół liczby, to
@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
)
Uwaga - wiodące zera są niedozwolone, ponieważ partia traktuje je jako ósemkowe, więc wartość podobna 09jest niepoprawna i 010ma wartość 8.
Zainspirowany doskonałą odpowiedzią Boba z następującymi dodatkami
Napraw logikę poziomu błędu
Zaimplementuj pętlę / element DoWork, który iteruje liczbę i wykonuje pewną arytmetykę
:::::::::::::::
::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^>
Problem polega na tym, że zawsze zwraca „Ważny numer”, ponieważ „jeśli poziom błędu 0” jest zawsze prawdziwy, ponieważ jest to porównanie „> = 0”, a nie porównanie „== 0”.
@echo off
set param=%1
echo %param%| findstr /r "^[1-9][0-9]*$">nul
if errorlevel 0 (
echo Valid number
)
Nie wiem dlaczego, ale w moim systemie findstrpolecenie to nie działało. Poziom błędu nie został zmieniony przy dopasowaniu lub bez dopasowania.
Wymyśliłem jednak inną metodę
:: 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.
Oto gra, która korzysta z tej funkcji.
@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
. Gdy dwa są równe - zmienna lub parametr jest liczbowy .Odpowiedzi:
Edytowane, aby naprawić regex zgodnie z komentarzem debham . Okazuje się, że dodanie spacji przed potokiem po echu dodaje spację do łańcucha potokowego, co wcześniej przerywało dopasowanie początku / końca linii. Wyrażenie regularne można jeszcze ulepszyć, odrzucając białe znaki na początku i na końcu.
Jest
findstr
polecenie. Może wyszukiwać pliki z wyrażeniami regularnymi, podobnie jakgrep
w Linuksie. Może także przeszukiwać dane wejściowe.Wyjaśnienie
Używany parametr jest ustawiany w
param
zmiennej. Jednak nic nie stoi%1
na przeszkodzie, abyś używał parametru bezpośrednio ( dla pierwszego parametru).findstr
służy do wyszukiwania danych wejściowych w potoku za pomocą/r
flagi pod kątem wyrażenia regularnego.Wzór:
^
oznacza początek linii.[0-9]
oznacza cyfrę. Te*
środki poprzedniego powtórzony zero lub więcej razy. Więc[0-9][0-9]*
oznacza jedną cyfrę, plus zero lub więcej cyfr. Innymi słowy, co najmniej jedna cyfra. Wydaje się, że+
jeden lub więcej razy nie jest obsługiwanyfindstr
. Zauważ, że[1-9]
pierwsza cyfra służy do niedopuszczenia zer wiodących - patrz komentarze.$
oznacza koniec linii.Teraz pętla for we wsadach x razy ... jeśli x nie jest prawidłową liczbą, pętla faktycznie nie działa wcale - jest po prostu pomijana w następnym wierszu. Nie trzeba więc sprawdzać, czy wprowadzony numer jest prawidłowy!
Pętla jest wykonywana przy użyciu
for /l
, gdzie(x,y,z)
oznacza początekx
, przyrost o,y
aż doz
osiągnięcia. I ustawia%%a
bieżącą liczbę / iterację.Uwaga: to faktycznie kończy się niepowodzeniem, jeśli na początku jest zero, co powoduje, że procesor poleceń traktuje go jako liczbę ósemkową. Zobacz odpowiedź dbenham na lepsze rozwiązanie.
źródło
"this 1 fails"
FINDSTR powinien dokładnie dopasować. Nie powinno pasować do słowa.09
lub010
może powodować problemy z powodu notacji ósemkowej. Zobacz moją odpowiedź na wyrażenie regularne, które nie pozwala na notację ósemkową.Poniższe działa dla mnie bardzo dobrze.
SET /a param=%1+0
zawsze zwraca,0
jeśli%1
jest pusta lub nie numeryczna. W przeciwnym razie podaje podaną liczbę.źródło
Wykryje to, czy pierwszy parametr jest prawidłową liczbą naturalną (nieujemna liczba całkowita).
Jeśli chcesz dopuścić cytaty wokół liczby, to
Uwaga - wiodące zera są niedozwolone, ponieważ partia traktuje je jako ósemkowe, więc wartość podobna
09
jest niepoprawna i010
ma wartość 8.źródło
Zainspirowany doskonałą odpowiedzią Boba z następującymi dodatkami
Problem polega na tym, że zawsze zwraca „Ważny numer”, ponieważ „jeśli poziom błędu 0” jest zawsze prawdziwy, ponieważ jest to porównanie „> = 0”, a nie porównanie „== 0”.
moje 0,02 $
źródło
Możesz sprawdzić dowolną zmienną, jeśli jej numer:
źródło
źródło
Nie wiem dlaczego, ale w moim systemie
findstr
polecenie to nie działało. Poziom błędu nie został zmieniony przy dopasowaniu lub bez dopasowania.Wymyśliłem jednak inną metodę
źródło
Oto gra, która korzysta z tej funkcji.
źródło