Ich muss testen, ob eine Variable gesetzt ist oder nicht. Ich habe verschiedene Techniken ausprobiert, aber sie scheinen immer dann zu scheitern%1
sie von Anführungszeichen umgeben sind, wie zum Beispiel wenn dies der Fall %1
ist "c:\some path with spaces"
.
IF NOT %1 GOTO MyLabel // This is invalid syntax
IF "%1" == "" GOTO MyLabel // Works unless %1 has double quotes which fatally kills bat execution
IF %1 == GOTO MyLabel // Gives an unexpected GOTO error.
Laut dieser Site sind dies die unterstützten IF
Syntaxtypen. Ich sehe also keinen Weg, dies zu tun.
IF [NOT] ERRORLEVEL number command
IF [NOT] string1==string2 command
IF [NOT] EXIST filename command
windows
shell
batch-file
cmd
blak3r
quelle
quelle
if "%1" == "" GOTO MyLabel
die Ausführung des Skripts nicht tödlich beendet, solange%1
eine gerade Anzahl von doppelten Anführungszeichen vorhanden ist. Ich sehe, dass eine ungerade Anzahl von doppelten Anführungszeichen%1
die Ausführung des Skripts mit diesem Fehler beendet:The syntax of the command is incorrect.
Die folgende Lösung, die eckige Klammern verwendet, um das Problem zu lösen, wurde als die richtige Antwort markiert, scheint aber nicht besser zu funktionieren . Diese Lösung schlägt auch mit demselben Fehler fehl, wenn%1
eine ungerade Anzahl von doppelten Anführungszeichen vorliegt .IF DEFINED
nur an Umgebungsvariablen statt an Skriptvariablen zu arbeiten, ist eine solche Verschwendung von Potenzial!Antworten:
Verwenden Sie eckige Klammern anstelle von Anführungszeichen:
Klammern sind unsicher : Verwenden Sie nur eckige Klammern.
quelle
&
in%1
wird die Linie brechenif #%1#==##
oderif [%1]==[]
ist gut, solange das Argument keine Leerzeichen enthält. Andernfalls wird eine…was unexpected at this time
Fehlermeldung angezeigt."%~1"
ist wirklich ein besserer Ansatz, wie ich in meiner Antwort erwähnt habe.==
. Verwenden Sie stattdessen seine Antwort.it DOES NOT work with spaces
. Verwenden Sie stattdessen die Antwort @jamesdlin.Sie können verwenden:
um den äußeren Satz von Anführungszeichen zu entfernen. Im Allgemeinen ist dies eine zuverlässigere Methode als die Verwendung von eckigen Klammern, da sie auch dann funktioniert, wenn die Variable Leerzeichen enthält.
quelle
~
Sie die äußeren Anführungszeichen, wenn sie vorhanden sind, und fügen sie dann manuell wieder hinzu (wobei nur ein Satz sichergestellt wird). Außerdem Sie haben zu Anführungszeichen verwenden , wenn das Argument Leerzeichen enthält (habe ich gelernt , diese auf die harte Tour , als meine vorherige Version der Verwendung#
oder Klammern statt Anführungszeichen Argumente mit Leerzeichen verursacht eine werfen…was unexpected at this time
Fehler.)""this string will crash the comparison""
: Double '"' ist die richtige Escape-Sequenz, und eine Ersetzung von double '"' schlägt fehl, wenn die Zeichenfolge ist leer."%~1"
.Eine der besten
%1
Halblösungen besteht darin, in eine Variable zu kopieren und dann die verzögerte Erweiterung als delayExp zu verwenden. ist immer sicher gegen Inhalte.Dies hat den Vorteil, dass der Umgang mit param1 absolut sicher ist.
Und die Einstellung von param1 funktioniert in vielen Fällen wie
Aber es scheitert immer noch mit seltsamen Inhalten wie
Um eine 100% korrekte Antwort auf die Existenz zu bekommen
Es erkennt, ob
%1
es leer ist, aber für einige Inhalte kann es den Inhalt nicht abrufen.Dies kann auch nützlich sein, um zwischen einem leeren
%1
und einem mit zu unterscheiden""
.Es nutzt die Fähigkeit des
CALL
Befehls, fehlzuschlagen, ohne die Batchdatei abzubrechen.Wenn Sie 100% kugelsicher sein möchten, um den Inhalt abzurufen, können Sie lesen, wie Sie selbst die seltsamsten Befehlszeilenparameter erhalten.
quelle
Von IF /?:
quelle
%1
und dergleichen. "In der Batchdatei definierte Variablen" sind Umgebungsvariablen, während die Batchdatei ausgeführt wird, und Sie könnenIF DEFINED
sie verwenden.Leider habe ich nicht genug Ruf, um die aktuellen Antworten zu kommentieren oder abzustimmen, auf die ich meine eigenen schreiben musste.
Ursprünglich lautete die Frage des OP "Variable" statt "Parameter", was sehr verwirrend wurde, zumal dies der Link Nummer eins in Google für die Suche nach Tests für leere Variablen war. Seit meiner ursprünglichen Antwort hat Stephan die ursprüngliche Frage bearbeitet, um die richtige Terminologie zu verwenden. Anstatt meine Antwort zu löschen, habe ich mich entschlossen, sie zu belassen, um Verwirrung zu beseitigen, insbesondere für den Fall, dass Google immer noch Leute nach Variablen schickt:
% 1 ist nicht variabel! ES IST EIN BEFEHLSLINIENPARAMETER.
Sehr wichtige Unterscheidung. Ein einzelnes Prozentzeichen mit einer Zahl nach einem Befehlszeilenparameter, der keine Variable ist.
Variablen werden mit dem Befehl set festgelegt und mit 2-Prozent-Zeichen abgerufen - eines vor und eines nach. Zum Beispiel% myvar%
Um auf eine leere Variable zu testen, verwenden Sie die Syntax "wenn nicht definiert" (Befehle explizit für Variablen erfordern keine Prozentzeichen), zum Beispiel:
(Wenn Sie Befehlszeilenparameter testen möchten, empfehle ich, auf die Antwort von jamesdlin zu verweisen.)
quelle
if variable is empty
bis zu korrigierenif parameter is empty
. Ich habe es einfach gemacht. (auf die Gefahr hin, einige der Antworten ungültig zu machen, die Variablen anstelle von Parametern überprüft haben und daher ohnehin ungültig sind, da sie die Frage nicht beantwortet haben)Verwenden Sie den Befehl "IF DEFINED variable", um die Variable in der Batchdatei zu testen.
Wenn Sie jedoch Stapelparameter testen möchten, versuchen Sie die folgenden Codes, um schwierige Eingaben zu vermeiden (z. B. "1 2" oder ab ^> cd).
quelle
Ich teste mit dem folgenden Code und es ist in Ordnung.
quelle
IF DEFINED var
aus einem GrundIch benutze normalerweise Folgendes:
Wenn% 1 leer ist, vergleicht die IF "." zu "." was als wahr ausgewertet wird.
quelle
Ich habe dieses kleine Batch-Skript basierend auf den Antworten hier erstellt, da es viele gültige gibt. Fühlen Sie sich frei, dies zu ergänzen, solange Sie dem gleichen Format folgen:
quelle
Leere Zeichenfolge ist ein Paar von
double-quotes
/""
, wir können nur die Länge testen:Testen Sie dann die 2 Zeichen gegen
double-quotes
:Hier ist ein Batch-Skript, mit dem Sie spielen können. Ich denke, es fängt die leere Zeichenfolge richtig auf.
Dies ist nur ein Beispiel. Sie müssen lediglich 2 (oder 3?) Schritte oben entsprechend Ihrem Skript anpassen.
Dieses Folter-Testergebnis:
quelle
""
Eine leere Zeichenfolge ist eine leere Zeichenfolge. Im Stapel ist eine leere Variable eine undefinierte Variable. Sie können definieren, dass für Ihre Argumente die äußeren Anführungszeichen entfernt werden, aber dann ist die Zeichenfolge mit einer Länge von 0 noch leer""
werden auch für leere Zeichenfolgen verwendet, aber es ist recht einfach%~1
, die äußeren Anführungszeichen zu entfernen. Es ist nicht nötig, eine so komplexe Lösung zu verwenden"%~1"==""
Argument,"Long File Name".txt
das ein gültiges Argument ist, schlagen fehl . edit : Und es ist definitiv nicht komplex wie du gesagt hast. Nur 2 Schritte oben für den Test, der Rest ist ein ausführliches Beispiel.Sie können verwenden
quelle
Skript 1:
Eingabe ("Remove Quotes.cmd" "Dies ist ein Test")
Ausgabe (Es gibt keine,% 1 war NICHT leer, leer oder NULL):
Führen Sie ("Remove Quotes.cmd") ohne Parameter mit dem obigen Skript 1 aus
Ausgabe (% 1 ist leer, leer oder NULL):
Hinweis: Wenn Sie eine Variable in einer
IF ( ) ELSE ( )
Anweisung festlegen, steht sie DEFINED erst nach dem Beenden der "IF" -Anweisung zur Verfügung (es sei denn, "Delayed Variable Expansion" ist aktiviert; verwenden Sie nach der Aktivierung ein Ausrufezeichen "!" Anstelle von Prozent "%" Symbol}.Beispielsweise:
Skript 2:
Eingabe ("Remove Quotes.cmd" "Dies ist ein Test")
Ausgabe:
Hinweis: Außerdem werden Anführungszeichen aus der Zeichenfolge entfernt.
Zum Beispiel (mit Skript 1 oder 2): C: \ Benutzer \ Test \ Dokumente \ Batchdateien> "Quotes.cmd entfernen" "Dies ist" ein "Test"
Ausgabe (Skript 2):
Führen Sie ("Remove Quotes.cmd") ohne Parameter in Skript 2 aus:
Ausgabe:
quelle
Um es zusammenzufassen:
Dieser Code gibt "Leere Zeichenfolge" aus, wenn% 1 entweder "" oder "oder leer ist. Er wurde der akzeptierten Antwort hinzugefügt, die derzeit falsch ist.
quelle
Ich hatte viele Probleme mit vielen Antworten im Internet. Die meisten arbeiten für die meisten Dinge, aber es gibt immer einen Eckfall, der jeden kaputt macht.
Vielleicht funktioniert es nicht, wenn es Anführungszeichen hat, vielleicht bricht es, wenn es keine Anführungszeichen hat, Syntaxfehler, wenn die Variable ein Leerzeichen hat, einige funktionieren nur mit Parametern (im Gegensatz zu Umgebungsvariablen), andere Techniken erlauben ein Leerzeichen Eine Reihe von Anführungszeichen, die als "definiert" übergeben werden sollen, und einige schwierigere lassen Sie nicht
else
hinterher verketten .Hier ist eine Lösung, mit der ich zufrieden bin. Bitte lassen Sie mich wissen, wenn Sie einen Eckkoffer finden, für den es nicht funktioniert.
Diese Unterroutine sollte entweder in Ihrem Skript oder in einem eigenen Skript vorhanden
.bat
sein.Also, wenn Sie schreiben wollten (in Pseudo):
Du kannst schreiben:
Es hat bei allen meinen Tests funktioniert:
Echo'd
n
,y
,n
,y
,y
Mehr Beispiele:
if
?Call :ifSet %var% && Echo set
Call :ifSet %var% || Echo set
Call :ifSet %1 && Echo set
ifSet.bat
? Kein Problem:((Call ifSet.bat %var%) && Echo set) || (Echo not set)
quelle
(Call ifSet.bat YES && (Echo true & Echo x | findstr y)) || Echo
, echostrue
undfalse
ifSet
und dannIf %errorlevel% EQU 0 (x) Else (y)
set
Variablen verwendet wurden (z. B.[%bob%]
nur für Argumente wie[%2]
), aber jetzt funktioniert es erneut. Ich denke, mein einziger Kritikpunkt im Moment[]
ist, dass leere Anführungszeichen passieren, während dies nicht der Fall ist (es liegt also wirklich an Ihrem Anwendungsfall)/B
Flag verhindert, dass der gesamte Stapel beendet wird, und beendet nur das Unterprogramm odercall
den Stapel. Es sei denn, Sie fragen, was der gesamte Befehl tut. Es wird ein Fehlercode zurückgegeben, um das aufrufende Skript über das Ergebnis der Unterroutine (0
bestanden,1
nicht bestanden) zu informieren, die über die boolesche Logik in der Antwort oder über%errorlevel%
die obigen Kommentare verwendet werden kannVerwenden! anstelle von "zur Überprüfung leerer Zeichenfolgen
quelle
Ich bin in knapp einem Monat eingestiegen (obwohl es vor 8 Jahren gefragt wurde) ... Ich hoffe, er / sie ist inzwischen über Batch-Dateien hinausgegangen. ;-) Ich habe das die ganze Zeit gemacht. Ich bin mir jedoch nicht sicher, was das ultimative Ziel ist. Wenn er / sie faul ist wie ich, funktioniert mein go.bat für solche Sachen. (Siehe unten) 1 Der Befehl im OP kann jedoch ungültig sein, wenn Sie die Eingabe direkt als Befehl verwenden. dh
ist ein ungültiger Befehl (oder früher, wenn Sie sich auf einem anderen Laufwerk befanden). Sie müssen es in zwei Teile teilen.
Und 2, was bedeutet "definiert" oder "undefiniert"? GIGO. Ich verwende die Standardeinstellung, um Fehler abzufangen. Wenn die Eingabe nicht abgefangen wird, wird sie zur Hilfe (oder als Standardbefehl) gelöscht. Keine Eingabe ist also kein Fehler. Sie können versuchen, eine CD an den Eingang zu senden und den Fehler abzufangen, falls vorhanden. (Ok, mit go "-Downloads (nur ein Paren) wird von DOS abgefangen. (Harsh!))
Und 3, Anführungszeichen werden nur um den Pfad herum benötigt, nicht um den Befehl. dh
war schlecht (oder früher gewohnt), es sei denn, Sie waren auf einer anderen Fahrt.
ist funktionsfähig.
funktioniert, wenn Sie Leerzeichen in Ihrem Pfad haben.
quelle
cd
den/d
Wechsel:cd /d "C:\Users\Me" (and the proper path delimeter for Windows is
`, nicht/
).