Mein Betriebssystem ist Windows Vista. Ich benötige eine ".bat" -Datei, in der ich überprüfen muss, ob der Benutzer einen Befehlszeilenparameter eingibt oder nicht. Wenn dies der Fall ist, wenn der Parameter gleich ist, -b
werde ich etwas tun, andernfalls werde ich "Ungültige Eingabe" markieren. Wenn der Benutzer keinen Befehlszeilenparameter eingibt, werde ich etwas tun. Ich habe folgende .bat-Datei erstellt. Es funktioniert für Fälle -b
und ist nicht gleich -b
- aber es schlägt fehl, wenn der Benutzer keinen Befehlszeilenparameter übergibt.
Ich bekomme immer Fehler:
GOTO was unexpected at this time.
Kann mir jemand sagen, was ich hier falsch mache?
ECHO OFF
CLS
ECHO.
IF [%1]==[/?] GOTO BLANK
IF %1=="-b" GOTO SPECIFIC
IF NOT %1=="-b" GOTO UNKNOWN
:SPECIFIC
ECHO SPECIFIC
GOTO DONE
:BLANK
ECHO No Parameter
GOTO DONE
:UNKNOWN
ECHO Unknown Option
GOTO DONE
:DONE
ECHO Done!
windows
file
batch-file
cmd
javauser71
quelle
quelle
GOTO BLANK
den beiden anderenIF
Anweisungen Klammern (wie in der Zeile) hinzufügen , wird das Problem dadurch behoben?Antworten:
Sie müssen überprüfen, ob der Parameter leer ist:
if "%~1"=="" goto blank
Sobald Sie das getan haben, schalten Sie -b ein / ein:
if "%~1"=="-b" (goto specific) else goto unknown
Das Umgeben der Parameter mit Anführungszeichen erleichtert das Überprüfen auf leere / leere / fehlende Parameter. "~" stellt sicher, dass doppelte Anführungszeichen entfernt werden, wenn sie sich im Befehlszeilenargument befinden.
quelle
File
. In diesem Fall sollten Sie nurexist
oder prüfennot exist
. Aus diesem Grund sollten Ihre Argumente gut definiert sein oder einfach Powershell oder VbScript verwenden (wenn Sie in denrun.bat "a b"
."%1"==""
stürzt ab, wenn das Argument ein Leerzeichen hat. Siehe stackoverflow.com/a/46942471Eine Antwort finden Sie unter http://ss64.com/nt/if.html . Der Befehl ist
IF [%1]==[] GOTO NO_ARGUMENT
oder ähnlich.quelle
"%1"==""
. Darauf muss ich in meiner eigenen Antwort näher eingehen.foo.bat "1st parameter" 2nd_param
. Siehe stackoverflow.com/questions/2541767/…[%1]==[-b]
stimmt nicht überein, wenn arg in Anführungszeichen steht. Beispielrun.bat "-b"
. Siehe stackoverflow.com/a/46942471Die kurze Antwort - verwenden Sie eckige Klammern:
oder (wenn Sie mit zitierten Argumenten umgehen müssen, siehe Bearbeiten unten):
Warum? du könntest fragen. Nun, genau wie Jeremiah Willcock es erwähnt hat: http://ss64.com/nt/if.html - das benutzen sie! OK, aber was ist los mit den Zitaten?
Nochmals kurze Antwort: Sie sind "magisch" - manchmal werden doppelte (doppelte) Anführungszeichen in einfache (doppelte) Anführungszeichen umgewandelt. Und sie müssen zunächst einmal zusammenpassen.
Betrachten Sie dieses kleine Skript:
Testen wir es:
Scheint zu funktionieren. Aber jetzt schalten wir in den zweiten Gang:
Boom Dies wurde weder als wahr noch als falsch bewertet. Das Skript starb. Wenn Sie den Reaktor irgendwo auf der ganzen Linie ausschalten sollten, dann haben Sie Pech. Du wirst jetzt wie Harry Daghlian sterben.
Sie denken vielleicht - OK, die Argumente dürfen keine Anführungszeichen enthalten. Wenn ja, passiert dies. Falsch Hier ist ein Trost:
Oh ja. Keine Sorge - manchmal dies wird funktionieren.
Versuchen wir es mit einem anderen Skript:
Sie können selbst testen, ob es in den oben genannten Fällen in Ordnung ist. Dies ist logisch - Anführungszeichen haben nichts mit Klammern zu tun, daher gibt es hier keine Magie. Aber was ist mit dem Aufpeppen der Argumente mit Klammern?
Kein Glück da. Die Klammern können den
cmd.exe
Parser einfach nicht ersticken .Kehren wir für einen Moment zu den bösen Zitaten zurück. Das Problem war da, als das Argument mit einem Zitat endete:
Was ist, wenn ich nur passiere:
Das Skript wird überhaupt nicht ausgeführt. Gleiches gilt für
args.bat
:Aber was bekomme ich
"
in einem solchen Fall , wenn die Anzahl der Zeichen "übereinstimmt" (dh - gerade ist):NICE - Ich hoffe, Sie haben etwas darüber gelernt, wie
.bat
Dateien ihre Befehlszeilenargumente aufteilen (TIPP: * Es ist nicht genau wie in Bash). Das obige Argument enthält ein Leerzeichen. Die Anführungszeichen werden jedoch nicht automatisch entfernt.Und argq? Wie reagiert es darauf? Vorhersehbar:
Denken Sie also nach, bevor Sie sagen: "Wissen Sie was? Verwenden Sie einfach Anführungszeichen. [Für mich sieht das besser aus]".
Bearbeiten
Vor kurzem gab es Kommentare zu dieser Antwort - nun, quadratische Klammern können nicht damit umgehen, zitierte Argumente zu übergeben und sie so zu behandeln, als wären sie nicht zitiert.
Die Syntax:
Ist keine neu gefundene Tugend der doppelten Anführungszeichen, sondern eine Anzeige eines ordentlichen Merkmals zum Entfernen von Anführungszeichen aus der Argumentvariablen, wenn das erste und letzte Zeichen ein doppeltes Anführungszeichen ist.
Diese "Technologie" funktioniert genauso gut mit eckigen Klammern:
Es war nützlich, darauf hinzuweisen, deshalb stimme ich auch der neuen Antwort zu.
Schließlich, Fans von doppelten Zitaten, gibt
""
es in Ihrem Buch ein Argument für das Formular , oder ist es leer? Frage nur' ;)quelle
[%1]==[-b]
stimmen nicht überein, wenn arg wie folgt zitiert wirdrun.bat "-b"
. Siehe stackoverflow.com/a/46942471[%1]==[-b]
und"%1"=="-b"
waren die gleichen für Batch-Skripte von Win 98 und früheren MS / PC-DOS-Systemen. Seit Win 2000 / NT wurde eine Syntax eingeführt,if "%~1"=="-b"
bei der doppelte Anführungszeichen eine besondere Bedeutung haben. So sollten Sie Skripte codieren, da sie einen robusteren Schutz bieten. Doppelte Anführungszeichen entziehen sich der Bedeutung von Sonderzeichen (versuchen Sie & | und% Zeichen in Ihrer Befehlszeile). 99,9% der Beispiele arbeiten mit doppelter Anführungszeichen - Ihr Beispielargq bla2" "bla3
dient nur zur Rechtfertigung eckiger Klammern. Eingebettete doppelte Anführungszeichen sind ein Rezept für eine Katastrophe - sagen Sie einfachcmd
Shell zitiert werden kann (im Sinne von - wörtlich gemacht durch eine Escape-Sequenz usw.) . In anderen Systemen können Sie manchmal alles zitieren, einschließlich NUL-Zeichen. ( stackoverflow.com/questions/2730732/… ) - Diese Frage zeigt nur, dass Sie ein externes Programm verwenden müssen.Zusätzlich zu den anderen Antworten, die ich abonniere, können Sie den
/I
Schalter desIF
Befehls verwenden.Dies kann hilfreich sein, wenn Sie Ihren Benutzern die Flexibilität geben möchten, die Parameter unabhängig von Groß- und Kleinschreibung zu berücksichtigen.
quelle
Sie vergleichen Zeichenfolgen. Wenn ein Argument weggelassen wird, wird es
%1
zu einem Leerzeichen erweitert, sodass die BefehleIF =="-b" GOTO SPECIFIC
beispielsweise (was ein Syntaxfehler ist) werden. Wickeln Sie Ihre Zeichenfolgen in Anführungszeichen (oder eckige Klammern).quelle
Eigentlich haben alle anderen Antworten Mängel. Der zuverlässigste Weg ist:
Ausführliche Erklärung:
Die Verwendung von
"%1"=="-b"
wird zum Absturz bringen, wenn Argumente mit Leerzeichen und Anführungszeichen übergeben werden. Dies ist die am wenigsten zuverlässige Methode.Die Verwendung
[%1]==[-b]
ist besser, da sie nicht mit Leerzeichen und Anführungszeichen abstürzt, aber nicht übereinstimmt, wenn das Argument von Anführungszeichen umgeben ist.Die Verwendung
"%~1"=="-b"
ist am zuverlässigsten.%~1
entfernt umgebende Anführungszeichen, wenn sie existieren. Es funktioniert also mit und ohne Anführungszeichen und auch ohne Argumente.quelle
IF [%~1]==[]
- das funktioniert und es funktioniert sogar"-b"
. Sie müssen nur in der Lage sein, in der Box zu denken , ähm, quadratisch [Klammern].Ich habe in letzter Zeit Probleme mit der Implementierung komplexer Parameterschalter in einer Batch-Datei. Hier ist das Ergebnis meiner Forschung. Keine der angegebenen Antworten ist völlig sicher, Beispiele:
"%1"=="-?"
stimmt nicht überein, wenn der Parameter in Anführungszeichen steht (wird für Dateinamen usw. benötigt) oder stürzt ab, wenn der Parameter in Anführungszeichen steht und Leerzeichen enthält (wiederum häufig in Dateinamen)Jede Kombination mit eckigen Klammern
[%1]==[-?]
oder[%~1]==[-?]
schlägt fehl, wenn der Parameter Leerzeichen in Anführungszeichen enthält:Die vorgeschlagene sicherste Lösung
"%~1"=="-?"
stürzt mit einem komplexen Parameter ab, der Text außerhalb der Anführungszeichen und Text mit Leerzeichen innerhalb der Anführungszeichen enthält:Die einzige Möglichkeit, um sicherzustellen, dass alle oben genannten Szenarien abgedeckt sind, besteht darin, EnableDelayedExpansion zu verwenden und die Parameter mithilfe von Variablen als Referenz (nicht nach Wert) zu übergeben. Dann funktioniert auch das komplexeste Szenario einwandfrei:
quelle
Windows Batch hat dazu das Schlüsselwort DEFINED.
quelle