Gibt es in der Windows NT-basierten Befehlszeile (hauptsächlich für XP oder höher) eine Möglichkeit zu überprüfen, ob es sich bei einem bereitgestellten Switch nur um eine Nummer handelt? Abhängig von der Anzahl möchte ich, dass der Code x mehrmals durchlaufen wird
10
set /a NO_LINES=%~1
; 2if %NO_LINES% NEQ %~1 goto ABORT
.. Wenn beide gleich sind - Die Variable oder der Parameter ist numerisch .Antworten:
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
findstr
Befehl. Es kann Dateien mit regulären Ausdrücken durchsuchen, ähnlich wiegrep
unter Linux. Es kann auch nach Piped-Eingaben suchen.Erläuterung
Der verwendete Parameter wird in die
param
Variable gesetzt. Es%1
hindert Sie jedoch nichts daran, den Parameter direkt zu verwenden ( für den ersten Parameter).findstr
wird verwendet, um die Pipe-Eingabe mit dem/r
Flag 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 werdenfindstr
. 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!
Die Schleife wird durchgeführt, indem
for /l
, dh(x,y,z)
Mittel beginnen beix
, umy
bisz
zum Erreichen erhöht wird. Und es wird%%a
auf 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.
quelle
"this 1 fails"
schlägt diese Lösung mit einem Parameter fehl, bei dem FINDSTR genau übereinstimmen sollte. Es sollte keine Wortübereinstimmung geben.09
oder010
kann aufgrund der Oktalschreibweise Probleme verursachen. Siehe meine Antwort für Regex, die die Oktalschreibweise nicht zulässt.Das Folgende funktioniert sehr gut für mich.
SET /a param=%1+0
Gibt immer zurück,0
wenn%1
es leer oder nicht numerisch ist. Andernfalls wird die angegebene Nummer angegeben.quelle
Dadurch wird erkannt, ob der erste Parameter eine gültige natürliche Zahl (nicht negative Ganzzahl) ist.
Wenn Sie Anführungszeichen um die Zahl zulassen möchten, dann
Hinweis - führende Nullen sind nicht zulässig, da sie im Stapel als oktal behandelt werden. Ein Wert wie
09
ist daher ungültig und010
hat den Wert 8.quelle
Inspiriert von Bobs hervorragender Antwort mit den folgenden Ergänzungen
Das Problem mit dem Folgenden ist, dass es immer 'Gültige Zahl' zurückgibt, weil 'wenn Fehlerstufe 0' immer wahr ist, da es sich um einen '> = 0'-Vergleich handelt, nicht um einen' == 0'-Vergleich.
meine $ .02
quelle
Sie können jede Variable überprüfen, wenn ihre Nummer:
quelle
quelle
Ich weiß nicht warum, aber auf meinem System hat der
findstr
Befehl nicht funktioniert. Die Fehlerstufe wurde beim Spiel nicht oder nicht geändert.Ich habe mir allerdings eine andere Methode ausgedacht
quelle
Hier ist ein Spiel, das diese Funktion verwendet.
quelle