In einer DOS-Batchdatei können wir nur 1 Zeile haben, wenn Anweisungshauptteil? Ich glaube, ich habe irgendwo einen Ort gefunden, den ich ()
für einen if-Block verwenden könnte, wie {}
er in C-ähnlichen Programmiersprachen verwendet wird, aber er führt die Anweisungen nicht aus, wenn ich dies versuche. Auch keine Fehlermeldung. Dies ist mein Code:
if %GPMANAGER_FOUND%==true(echo GP Manager is up
goto Continue7
)
echo GP Manager is down
:Continue7
Seltsamerweise wird beim Ausführen der Batchdatei weder "GP Manager ist aktiv" noch "GP Manager ist nicht verfügbar" gedruckt.
if-statement
batch-file
Hugh Darling
quelle
quelle
Antworten:
Sie können in der Tat einen Anweisungsblock erstellen, der nach einer Bedingung ausgeführt werden soll. Aber Sie haben die falsche Syntax. Die Klammern müssen genau wie gezeigt verwendet werden:
Ich glaube jedoch nicht, dass es eine eingebaute Syntax für
else-if
Anweisungen gibt. Sie müssen leider verschachtelteif
Anweisungsblöcke erstellen, um dies zu handhaben.Zweitens
%GPMANAGER_FOUND% == true
sieht dieser Test für mich sehr verdächtig aus. Ich weiß nicht, auf was die Umgebungsvariable eingestellt ist oder wie Sie sie einstellen, aber ich bezweifle sehr, dass der von Ihnen angezeigte Code das gewünschte Ergebnis liefert.Der folgende Beispielcode funktioniert gut für mich:
Bitte beachten Sie einige spezifische Details zu meinem Beispielcode:
@echo off
möchte nicht alle Anweisungen sehen, die während der Ausführung auf der Konsole gedruckt werden, sondern nur die Ausgabe derjenigen, die speziell damit beginnenecho
.ERRORLEVEL
Variable nur als Test. Lesen Sie hier mehrquelle
ERRORLEVEL
ist nicht die Antwort auf sein Problem. Ich habe lediglich ein Beispiel für die richtige Syntax veröffentlicht. Jede Form ist in diesem Fall genauso akzeptabel wieif 0 == 0
jeder andere triviale Ausdruck. Stellen Sie jedoch sicher, dass Sie den Unterschied zwischen der Umgebungsvariablen%ERRORLEVEL%
und der internenERRORLEVEL
des Befehlsprozessors verstehen . Raymond Chen erklärt es hier auf diesem Blog .REM This is a comment (or so I thought)
in denIF
Block wird Sie durcheinander bringen.IF %somevar%==example_string2
es sollte immer Code sein, daher sollte der Operand inIF "value_of_somevar"=="example_string2
"aufgelöst werden, um Sonderzeichen in beiden Zeichenfolgenoperanden zu vermeiden, die Syntaxfehler in derIF
Anweisung verursachen. Die von Ihnen festgelegten Werte sollten immer so ausgeführt werden,set "somevar=value_of_somevar"
dass Sie mit dieser Syntax Sonderzeichen in variablen Werten umgehen können. Hinweis das meine ich nichtset somevar="value_of_somevar"
Logisch, Codys Antwort sollte funktionieren. Ich glaube jedoch nicht, dass die Eingabeaufforderung einen Codeblock logisch behandelt. Für mein Leben kann ich nicht erreichen, dass das mit mehr als einem einzelnen Befehl innerhalb des Blocks richtig funktioniert. In meinem Fall haben umfangreiche Tests ergeben, dass alle Befehle innerhalb des Blocks zwischengespeichert und gleichzeitig am Ende des Blocks ausgeführt werden. Dies führt natürlich nicht zu den erwarteten Ergebnissen. Hier ist ein stark vereinfachtes Beispiel:
Dies sollte var3 den folgenden Wert geben:
sondern ergibt:
weil alle 3 Befehle beim Verlassen des Codeblocks zwischengespeichert und gleichzeitig ausgeführt werden.
Ich konnte dieses Problem lösen, indem ich den if-Block neu schrieb, um nur einen Befehl auszuführen - goto - und einige Beschriftungen hinzufügte. Es ist klobig und ich mag es nicht sehr, aber zumindest funktioniert es.
quelle
set var3=!var1!_!var2!
Versuchen Sie stattdessen, das kaufmännische Und & oder das doppelte kaufmännische Und && (abhängig von Fehlerstufe 0) als Befehlstrennzeichen zu verwenden.
Ich habe mit diesem Trick ein Skript-Snippet repariert. Zusammenfassend habe ich drei Batch-Dateien, von denen eine die beiden anderen aufruft, nachdem ich herausgefunden habe, welche Buchstaben den externen Sicherungslaufwerken zugewiesen wurden. Ich lasse die erste Datei auf dem primären externen Laufwerk, sodass die Aufrufe der Sicherungsroutine einwandfrei funktionierten, aber die Aufrufe des zweiten Laufwerks erforderten einen aktiven Laufwerkswechsel. Der folgende Code zeigt, wie ich das Problem behoben habe:
quelle
Ich bin auf diesen Artikel in den Ergebnissen gestoßen, die von einer Suche im Zusammenhang mit dem IF-Befehl in einer Batchdatei zurückgegeben wurden, und ich konnte der Gelegenheit nicht widerstehen, das Missverständnis zu korrigieren, dass IF-Blöcke auf einzelne Befehle beschränkt sind. Im Folgenden finden Sie einen Teil eines Windows NT-Produktionsbefehlsskripts, das täglich auf dem Computer ausgeführt wird, auf dem ich diese Antwort verfasse.
Möglicherweise gelten Blöcke mit zwei oder mehr Zeilen ausschließlich für Windows NT-Befehlsskripte (CMD-Dateien), da bei einer Suche im Produktionsskriptverzeichnis einer Anwendung, die auf BAT-Dateien (Old School Batch) beschränkt ist, nur Ein-Befehlsblöcke angezeigt wurden . Da die Anwendung erweitert wurde (was bedeutet, dass ich nicht aktiv an der Unterstützung beteiligt bin), kann ich nicht sagen, ob dies daran liegt, dass ich nicht mehr als eine Zeile benötigte oder dass ich sie nicht zum Laufen bringen konnte.
Unabhängig davon, ob letzteres zutrifft, gibt es eine einfache Problemumgehung. Verschieben Sie die mehreren Zeilen entweder in eine separate Batchdatei oder in eine Batchdatei-Unterroutine. Ich weiß, dass Letzteres in beiden Arten von Skripten funktioniert.
quelle
Vielleicht etwas spät, aber ich hoffe, es geht schief:
quelle