Gibt es eine Möglichkeit, eine bedingte IF- oder IF-Anweisung in eine Windows-Batchdatei zu schreiben?
Beispielsweise:
IF [%var%] == [1] OR IF [%var%] == [2] ECHO TRUE
windows
batch-file
if-statement
cmd
conditional
Mechaflash
quelle
quelle
IF [%var%]==[1] IF [%var2%]==[2] ECHO BOTH ARE TRUE
. Ich habe immer definiertSET AND=IF
und dann geschrieben :IF cond1 %AND% cond2 ECHO BOTH ARE TRUE
.Antworten:
Die zmbq-Lösung ist gut, kann jedoch nicht in allen Situationen verwendet werden, z. B. in einem Codeblock wie einer FOR DO (...) - Schleife.
Eine Alternative ist die Verwendung einer Indikatorvariablen. Initialisieren Sie es so, dass es nicht definiert ist, und definieren Sie es dann nur, wenn eine der ODER-Bedingungen erfüllt ist. Verwenden Sie dann IF DEFINED als letzten Test - Sie müssen keine verzögerte Erweiterung verwenden.
Sie könnten die ELSE IF-Logik hinzufügen, die arasmussen verwendet, weil sie möglicherweise etwas schneller ausgeführt wird, wenn die erste Bedingung erfüllt ist, aber ich kümmere mich nie darum.
Nachtrag - Dies ist eine doppelte Frage mit nahezu identischen Antworten auf die Verwendung eines ODER in einem WinXP-Batch-Skript mit IF-Anweisung
Letzter Nachtrag - Ich habe fast meine Lieblingstechnik vergessen, um zu testen, ob eine Variable zu einer Liste von Werten gehört, bei denen die Groß- und Kleinschreibung nicht berücksichtigt wird. Initialisieren Sie eine Testvariable, die eine begrenzte Liste akzeptabler Werte enthält, und testen Sie dann mithilfe von Suchen und Ersetzen, ob sich Ihre Variable in der Liste befindet. Dies ist sehr schnell und verwendet minimalen Code für eine beliebig lange Liste. Es erfordert eine verzögerte Erweiterung (oder den Trick CALL %% VAR %%). Auch der Test ist CASE INSENSITIVE.
Das Obige kann fehlschlagen, wenn VAR enthält
=
, sodass der Test nicht narrensicher ist.Wenn Sie den Test innerhalb eines Blocks durchführen, in dem eine verzögerte Erweiterung erforderlich ist, um auf den aktuellen Wert von VAR zuzugreifen, dann
Abhängig von den erwarteten Werten in VAR sind möglicherweise FOR-Optionen wie "delims =" erforderlich
Die obige Strategie kann auch
=
in VAR durch Hinzufügen von etwas mehr Code zuverlässig gemacht werden.Jetzt haben wir jedoch die Möglichkeit verloren, eine ELSE-Klausel bereitzustellen, sofern wir keine Indikatorvariable hinzufügen. Der Code hat begonnen, ein bisschen "hässlich" auszusehen, aber ich denke, er ist die zuverlässigste Methode zum Testen, ob VAR eine beliebige Anzahl von Optionen ist, bei denen die Groß- und Kleinschreibung nicht berücksichtigt wird.
Schließlich gibt es eine einfachere Version, die meiner Meinung nach etwas langsamer ist, da für jeden Wert eine IF ausgeführt werden muss. Aacini hat diese Lösung in einem Kommentar zur akzeptierten Antwort im zuvor genannten Link bereitgestellt
Die Werteliste darf nicht das * oder? Enthalten. Zeichen und die Werte und
%VAR%
sollte keine Anführungszeichen enthalten. Zitate führen zu Problemen , wenn die%VAR%
auch Leer- oder Sonderzeichen enthalten wie^
,&
usw. Eine andere Einschränkung bei dieser Lösung ist es nicht die Möglichkeit , für eine ELSE - Klausel zur Verfügung stellen , wenn Sie eine Indikatorvariable hinzufügen. Vorteile sind, dass je nach Vorhandensein oder Fehlen einer IF-/I
Option zwischen Groß- und Kleinschreibung unterschieden werden kann .quelle
Das glaube ich nicht. Verwenden Sie einfach zwei IFs und GOTO das gleiche Label:
quelle
ECHO Didn't find it
selbst wenn es es finden würde.Danke für diesen Beitrag, er hat mir sehr geholfen.
Keine Ahnung, ob es helfen kann, aber ich hatte das Problem und dank Ihnen habe ich herausgefunden, was meiner Meinung nach ein anderer Weg ist, es basierend auf dieser booleschen Äquivalenz zu lösen:
"A oder B" ist dasselbe wie "nicht (nicht A und nicht B)"
So:
Wird:
quelle
Ein einfaches "FOR" kann in einer einzelnen Zeile verwendet werden, um eine "oder" Bedingung zu verwenden:
Auf Ihren Fall angewendet:
quelle
Auch wenn diese Frage etwas älter ist:
Wenn Sie verwenden möchten,
if cond1 or cond 2
sollten Sie keine komplizierten Schleifen oder ähnliches verwenden.Einfach beides
ifs
nacheinander in Kombination mitgoto
- das ist ein implizites oder.Ohne goto, aber eine "Inplace" -Aktion, können Sie die Aktion dreimal ausführen, wenn ALLE Bedingungen übereinstimmen.
quelle
Es gibt jedoch kein
IF <arg> OR
oderELIF
oderELSE IF
in Batch ...Versuchen Sie, die anderen IFs im ELSE der vorherigen IF zu verschachteln.
quelle
Es ist möglich, eine Funktion zu verwenden, die die ODER-Logik auswertet und einen einzelnen Wert zurückgibt.
quelle
&& ... || ...
Syntax direkt anstelle der zusätzlichenIF ... ELSE ...
Anweisung verwenden.Das Ziel kann durch indirekte Verwendung von IFs erreicht werden.
Im Folgenden finden Sie ein Beispiel für einen komplexen Ausdruck, der in einem CMD-Stapel ohne inkohärente Beschriftungen und GOTOs sehr präzise und logisch geschrieben werden kann.
Codeblöcke zwischen () Klammern werden von CMD als (pathetische) Art von Unterschale behandelt. Welcher Exit-Code aus einem Block kommt, wird verwendet, um den True / False-Wert zu bestimmen, den der Block in einem größeren booleschen Ausdruck spielt. Mit diesen Codeblöcken können beliebig große boolesche Ausdrücke erstellt werden.
Einfaches Beispiel
Jeder Block wird in true aufgelöst (dh ERRORLEVEL = 0, nachdem die letzte Anweisung im Block ausgeführt wurde) / false, bis der Wert des gesamten Ausdrucks bestimmt wurde oder die Steuerung herausspringt (z. B. über GOTO):
Komplexes Beispiel
Dies löst das ursprünglich aufgeworfene Problem. In jedem Block sind mehrere Anweisungen möglich, jedoch im || || || Ausdruck Es ist vorzuziehen, präzise zu sein, damit es so lesbar wie möglich ist. ^ ist ein Escape-Zeichen in CMD-Stapeln. Wenn es am Ende einer Zeile platziert wird, wird es der EOL entkommen und CMD anweisen, den aktuellen Stapel von Anweisungen in der nächsten Zeile weiterzulesen.
quelle
Hiermit wird überprüft, ob mehrere Variablen den gleichen Wert haben. Hier ist für jede Variable.
Ich habe nur von oben an das gedacht, wenn mein Kopf. Ich könnte es mehr verdichten.
quelle
Mir ist klar, dass diese Frage alt ist, aber ich wollte eine alternative Lösung veröffentlichen, falls jemand anderes (wie ich) diesen Thread gefunden hat, während er dieselbe Frage hat. Ich konnte das Fehlen eines OR-Operators umgehen, indem ich die Variable wiederholte und findstr zur Validierung verwendete.
quelle
Während die Antwort von dbenham ziemlich gut ist,
IF DEFINED
kann das Verlassen auf Sie in große Schwierigkeiten geraten, wenn die Variable, die Sie überprüfen, keine Umgebungsvariable ist. Skriptvariablen erhalten diese spezielle Behandlung nicht.Während dies wie eine lächerliche undokumentierte BS erscheinen mag, zeigt eine einfache Shell-Abfrage
IF
mitIF /?
, dassGibt es bei der Beantwortung dieser Frage einen Grund, nach einer Reihe von Bewertungen nicht einfach ein einfaches Flag zu verwenden? Dies scheint
OR
mir die flexibelste Prüfung zu sein, sowohl hinsichtlich der zugrunde liegenden Logik als auch der Lesbarkeit. Beispielsweise:Natürlich können sie jede Art von bedingter Bewertung sein, aber ich teile nur einige Beispiele.
Wenn Sie alles schriftlich in einer Zeile haben möchten, können Sie sie einfach mit folgenden Elementen verketten
&&
:quelle
Nie existiert, um zu arbeiten.
Ich benutze wenn nicht vorhanden g: xyz / was gehe zu h: Sonst xcopy c: aktuell / Dateien g: bu / aktuell Es gibt Modifikatoren / a usw. Ich bin mir nicht sicher, welche. Laptop im Laden. Und Computer im Büro. Ich bin nicht da.
Batch-Dateien funktionieren nie über Windows XP
quelle
Eine viel schnellere Alternative, die ich normalerweise verwende, ist die folgende, da ich eine beliebige Anzahl von Bedingungen "oder" kann, die in einen variablen Raum passen können
quelle
Als mir klar wurde, dass dies eine alte Frage ist, haben mir die Antworten geholfen, eine Lösung zum Testen von Befehlszeilenargumenten für eine Batchdatei zu finden. Daher wollte ich meine Lösung auch veröffentlichen, falls jemand anderes nach einer ähnlichen Lösung suchte.
Als erstes sollte ich darauf hinweisen, dass ich Probleme hatte, IF ... ELSE-Anweisungen innerhalb einer FOR ... DO-Klausel zum Laufen zu bringen. Es stellt sich heraus (danke an dbenham, dass er in seinen Beispielen versehentlich darauf hingewiesen hat), dass die ELSE-Anweisung nicht in einer separaten Zeile von den schließenden Parens stehen darf.
Also stattdessen:
Was meine Präferenz für Lesbarkeit und ästhetische Gründe ist, müssen Sie dies tun:
Jetzt wird die ELSE-Anweisung nicht als nicht erkannter Befehl zurückgegeben.
Schließlich habe ich Folgendes versucht: Ich wollte in der Lage sein, mehrere Argumente in beliebiger Reihenfolge an eine Batchdatei zu übergeben, Groß- und Kleinschreibung zu ignorieren und undefinierte Argumente zu melden / fehlzuschlagen. Hier ist meine Lösung ...
Beachten Sie, dass dies nur über das erste fehlgeschlagene Argument berichtet. Wenn der Benutzer also mehr als ein inakzeptables Argument eingibt, wird er nur über das erste informiert, bis es korrigiert ist, dann über das zweite usw.
quelle