it-swarm.com.de

Kann ich einen IF-Block in der DOS-Batchdatei haben?

In einer DOS-Batchdatei können wir nur eine Zeile haben, wenn der Hauptteil der Anweisung? Ich denke, ich habe irgendwo gefunden, dass ich () für einen if-Block verwenden könnte, genau wie der {}, der 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 werden weder "GP Manager ist noch" oder "GP Manager ist inaktiv" gedruckt, wenn ich die Stapeldatei ausführe.

84
Hugh Darling

Sie können tatsächlich einen Anweisungsblock erstellen, der nach einer Bedingung ausgeführt wird. Aber Sie haben die Syntax falsch. Die Klammern müssen genau wie gezeigt verwendet werden:

if <statement> (
    do something
) else (
    do something else
)

Ich glaube jedoch nicht, dass es eine integrierte Syntax für else-if-Anweisungen gibt. Sie müssen dazu leider geschachtelte Blöcke von if-Anweisungen erstellen.


.__ Zweitens sieht dieser %GPMANAGER_FOUND% == true-Test für mich verdächtig aus. Ich weiß nicht, worauf die Umgebungsvariable eingestellt ist oder wie Sie sie einstellen, aber ich bezweifle sehr, dass der von Ihnen gezeigte Code das Ergebnis liefert, nach dem Sie suchen.


Der folgende Beispielcode funktioniert für mich gut:

@echo off

if ERRORLEVEL == 0 (
    echo GP Manager is up
    goto Continue7
)
echo GP Manager is down
:Continue7

Bitte beachten Sie einige Details zu meinem Beispielcode:

  • Der Raum, der zwischen dem Ende der Bedingungsanweisung und der öffnenden Klammer hinzugefügt wird.
  • Ich setze @echo off, um zu vermeiden, dass all der Anweisungen in der Konsole gedruckt wird, während sie ausgeführt werden, und stattdessen nur die Ausgabe derjenigen angezeigt wird, die speziell mit echo beginnen.
  • Ich verwende die eingebaute Variable ERRORLEVEL nur als Test. Lesen Sie mehr hier
121
Cody Gray

Logisch ist die Antwort von Cody sollte funktionieren. Ich denke jedoch nicht, dass der Befehl Prompt einen Codeblock logisch behandelt. Für das Leben von mir kann ich nicht mit mehr als einem einzigen Befehl innerhalb des Blocks arbeiten. In meinem Fall haben umfangreiche Tests gezeigt, 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:

if %ERRORLEVEL%==0 (
set var1=blue
set var2=cheese
set var3=%var1%_%var2%
)

Diese sollte var3 mit dem folgenden Wert versehen:

blue_cheese

aber stattdessen ergibt:

_

weil alle 3 Befehle zwischengespeichert und beim Verlassen des Codeblocks gleichzeitig ausgeführt werden. 

Ich konnte dieses Problem überwinden, indem ich den if-Block neu schrieb, um nur einen Befehl auszuführen - goto - und ein paar Labels hinzufügte. Es ist klobig und ich mag es nicht sehr, aber zumindest funktioniert es.

if %ERRORLEVEL%==0 goto :error0
goto :endif

:error0
set var1=blue
set var2=cheese
set var3=%var1%_%var2%

:endif
13
Nick

Vielleicht ein bisschen zu spät, aber ich hoffe es wird hellps:

@echo off 

if %ERRORLEVEL% == 0 (
msg * 1st line WORKS FINE rem You can relpace msg * with any othe operation...
goto Continue1
)
:Continue1
If exist "C:\Python31" (
msg * 2nd line WORKS FINE rem You can relpace msg * with any othe operation...
    goto Continue2
)
:Continue2
If exist "C:\Python31\Lib\site-packages\PyQt4" (  
msg * 3th line WORKS FINE rem You can relpace msg * with any othe operation...
    goto Continue3
)
:Continue3
msg * 4th line WORKS FINE rem You can relpace msg * with any othe operation...
    goto Continue4
)
:Continue4
msg * "Tutto a posto" rem You can relpace msg * with any othe operation...
pause
0
vinniejohnson

Versuchen Sie, anstelle dieses goto chaos das kaufmännische Und & oder das doppelte kaufmännische Und & (bedingte Bedingung 0) als Befehlstrennzeichen zu verwenden.

Ich habe ein Skript-Snippet mit diesem Trick repariert. Zusammenfassend habe ich drei Batch-Dateien, von denen eine die anderen beiden aufruft, nachdem ermittelt wurde, welche Buchstaben den externen Sicherungslaufwerken zugewiesen wurden. Ich belasse die erste Datei auf dem primären externen Laufwerk, sodass die Aufrufe der Sicherungsroutine einwandfrei funktionieren, die Aufrufe des zweiten Laufwerks jedoch eine aktive Laufwerksänderung erforderlich machten. Der folgende Code zeigt, wie ich es behoben habe:

für %% b in (d e f g h i j k l m n o p q r s tu v w x y z) DO ( falls vorhanden "%% b:\Backup.cmd" %% b: & CALL "%% b:\Backup.cmd" )

0
Louis

Ich habe diesen Artikel in den Ergebnissen gefunden, die von einer mit dem IF-Befehl in einer Batchdatei verknüpften Suche zurückgegeben wurden, und ich konnte der Gelegenheit nicht widerstehen, die falsche Vorstellung zu korrigieren, dass IF-Blöcke auf einzelne Befehle beschränkt sind. Nachfolgend finden Sie einen Teil eines Produktions-Windows NT-Befehlsskripts, das täglich auf dem Computer ausgeführt wird, auf dem ich diese Antwort verfasse.

    if "%COPYTOOL%" equ "R" (
    WWLOGGER.exe "%APPDATA%\WizardWrx\%~n0.LOG" "Using RoboCopy to make a backup of %USERPROFILE%\My Documents\Outlook Files\*"
    %TOOLPATH% %SRCEPATH% %DESTPATH% /copyall %RCLOGSTR% /m /np /r:0 /tee
    C:\BIN\ExitCodeMapper.exe C:\BIN\ExitCodeMapper.INI[Robocopy] %TEMP%\%~n0.TMP %ERRORLEVEL%
) else (
    WWLOGGER.exe "%APPDATA%\WizardWrx\%~n0.LOG" "Using XCopy to make a backup of %USERPROFILE%\My Documents\Outlook Files\*"
    call %TOOLPATH%  "%USERPROFILE%\My Documents\Outlook Files\*" "%USERPROFILE%\My Documents\Outlook Files\_backups" /f /m /v /y
    C:\BIN\ExitCodeMapper.exe C:\BIN\ExitCodeMapper.INI[Xcopy] %TEMP%\%~n0.TMP %ERRORLEVEL%
)

Möglicherweise gelten Blöcke aus zwei oder mehr Zeilen ausschließlich für Windows NT-Befehlsskripts (.CMD-Dateien), da bei einer Suche im Verzeichnis der Produktionsscripts einer Anwendung, die auf alte Schulstapeldateien (.BAT) beschränkt ist, nur Ein-Befehlsblöcke gefunden wurden . Da die Anwendung in die erweiterte Wartung gegangen ist (was bedeutet, dass ich nicht aktiv an der Unterstützung beteiligt bin), kann ich nicht sagen, ob dies darauf zurückzuführen ist, dass ich nicht mehr als eine Leitung benötigte oder dass ich sie nicht zum Laufen bringen konnte.

Unabhängig davon, wenn Letzteres wahr ist, gibt es eine einfache Problemumgehung. Verschieben Sie die mehreren Zeilen entweder in eine separate Batchdatei oder in eine Subroutine für die Batchdatei. Ich weiß, dass Letzteres in beiden Arten von Skripten funktioniert.

0
David A. Gray