Bearbeitet, um den regulären Ausdruck gemäß dem Kommentar von debham zu korrigieren . Es stellt sich heraus, dass das Hinzufügen eines Leerzeichens vor der Pipe nach dem Echo der Piping-Zeichenfolge ein Leerzeichen hinzufügt, was den Anfang / das Ende der Zeilenübereinstimmung zuvor unterbrochen hat. Die Regex könnte weiter verbessert werden, indem Leerzeichen am Anfang und am Ende verworfen werden.
Da ist der findstrBefehl. Es kann Dateien mit regulären Ausdrücken durchsuchen, ähnlich wie grepunter Linux. Es kann auch nach Piped-Eingaben suchen.
@echo off
set param=%1
echo %param%| findstr /r "^[1-9][0-9]*$">nul
if %errorlevel% equ 0 (
echo Valid number
)
Erläuterung
Der verwendete Parameter wird in die paramVariable gesetzt. Es %1hindert Sie jedoch nichts daran, den Parameter direkt zu verwenden ( für den ersten Parameter).
findstrwird verwendet, um die Pipe-Eingabe mit dem /rFlag nach Regex zu durchsuchen .
Das Muster:
^ bedeutet Zeilenanfang.
[0-9]bedeutet eine Ziffer. Dies *bedeutet, dass die vorherigen null oder mehrmals wiederholt wurden. Bedeutet [0-9][0-9]*also eine Ziffer plus null oder mehr Ziffern. Mit anderen Worten, mindestens eine Ziffer. Das +eine oder mehrere Mal scheint nicht von unterstützt zu werden findstr. Beachten Sie, dass [1-9]für die erste Ziffer führende Nullen nicht zugelassen werden - siehe Kommentare.
$ bedeutet Zeilenende.
Nun, eine for-Schleife im Batch für x- mal ... Wenn x keine gültige Zahl ist, wird die Schleife überhaupt nicht ausgeführt - sie wird nur für die nächste Zeile übersprungen. Es muss also nicht überprüft werden, ob die Eingabe eine gültige Nummer ist!
@echo off
set param=%1
for /l %%a in (1,1,%param%) do (
echo %%a
)
Die Schleife wird durchgeführt, indem for /l, dh (x,y,z)Mittel beginnen bei x, um ybis zzum Erreichen erhöht wird. Und es wird %%aauf die aktuelle Nummer / Iteration gesetzt.
Hinweis: Dies schlägt tatsächlich fehl, wenn eine führende Null vorhanden ist, wodurch der Befehlsprozessor diese als Oktalzahl behandelt. Siehe dbenhams Antwort für eine bessere Lösung.
set /a NO_LINES=%~1; 2if %NO_LINES% NEQ %~1 goto ABORT.. Wenn beide gleich sind - Die Variable oder der Parameter ist numerisch .