Wie verwende ich die if - else-Struktur in einer Batchdatei?

136

Ich habe eine Frage zu if - else Struktur in einer Batchdatei. Jeder Befehl wird einzeln ausgeführt, aber ich konnte "if - else" -Blöcke nicht sicher verwenden, sodass diese Teile meines Programms nicht funktionieren. Wie kann ich diese Teile zum Laufen bringen? Danke dir.

IF %F%==1 IF %C%==1 (
    ::copying the file c to d
    copy "%sourceFile%" "%destinationFile%"
    )
ELSE IF %F%==1 IF %C%==0 (
    ::moving the file c to d
    move "%sourceFile%" "%destinationFile%"
    )

ELSE IF %F%==0 IF %C%==1 (
    ::copying a directory c from d, /s:  boş olanlar hariç, /e:boş olanlar dahil
    xcopy "%sourceCopyDirectory%" "%destinationCopyDirectory%" /s/e
    )
ELSE IF %F%==0 IF %C%==0 (
    ::moving a directory
    xcopy /E "%sourceMoveDirectory%" "%destinationMoveDirectory%"
    rd /s /q "%sourceMoveDirectory%"
    )
gleichnamig
quelle
Ist meine Frage klar gelesen? Ich lese es Zeile für Zeile, aber es scheint mir Seite an Seite.
gleichnamig
4
Hallo, Willkommen bei Stack Overflow! Um einen Codeblock zu erstellen, können Sie den relevanten Text markieren und auf die {}Schaltfläche klicken . Dies hilft, Beiträge besser lesbar zu machen und vermeidet Probleme mit dem Markup. Als Antwort auf Ihre Frage tut es jetzt! Wenn Sie eine Frage schreiben, sehen Sie unten eine Vorschau, damit Sie sehen können, wie sie nach dem Posten aussehen wird.
Ben
1
Vielen Dank für Ihre Erklärung. Ich werde diese Methode anwenden.
gleichnamig

Antworten:

110

Ihre Syntax ist falsch. Sie können nicht verwenden ELSE IF. Es scheint, dass Sie es sowieso nicht wirklich brauchen. Verwenden Sie einfach mehrere IFAnweisungen:

IF %F%==1 IF %C%==1 (
    ::copying the file c to d
    copy "%sourceFile%" "%destinationFile%"
    )

IF %F%==1 IF %C%==0 (
    ::moving the file c to d
    move "%sourceFile%" "%destinationFile%"
    )

IF %F%==0 IF %C%==1 (
    ::copying a directory c from d, /s:  boş olanlar hariç, /e:boş olanlar dahil
    xcopy "%sourceCopyDirectory%" "%destinationCopyDirectory%" /s/e
    )

IF %F%==0 IF %C%==0 (
    ::moving a directory
    xcopy /E "%sourceMoveDirectory%" "%destinationMoveDirectory%"
    rd /s /q "%sourceMoveDirectory%"
    )

Hervorragende Referenz für Batchdateien: http://ss64.com/nt/if.html

James Hill
quelle
2
Bitte korrigieren Sie mich, wenn ich falsch liege, aber ich glaube nicht, dass Sie unter &&mehreren ifBedingungen verwenden können. Sehen Sie sich meine alternative Syntax an.
Bali C
Wenn meine if-Bedingungen wie folgt lauten: "IF% F% == 0" läuft sicher, aber wenn ich && hinzufüge, läuft es nicht. Wie kann ich zwei Bedingungen in einem Wenn verwenden?
gleichnamig
1
@aprogrammer, schau dir mein Beispiel an. Wenn Sie mehrere Bedingungen haben, verwenden SieIF condition1 IF condition 2
James Hill
Ich hatte Ihre Antwort ausprobiert, konnte sie aber nicht ausführen, aber ich habe es erneut versucht und meinen Code geändert und sie ausgeführt. Die letzte Situation eines Teils meines Codes sieht folgendermaßen aus: IF% F% == 1 IF% C% == 1 (:: Kopieren der Datei c nach d Kopieren von "% sourceFile%" "% destinationFile%") ELSE (IF % F% == 1 IF% C% == 0 (:: Verschieben der Datei c nach d Verschieben von "% sourceFile%" "% destinationFile%")) ELSE (IF% F% == 0 IF% C% == 1 (:: Kopieren eines Verzeichnisses c aus d, / s: boş olanlar hariç, / e: boş olanlar dahil xcopy "% sourceCopyDirectory%" "% destinationCopyDirectory%" / s / e))
gleichnamig
4
Was meinst du damit, dass du es nicht benutzen kannst ELSE IF? Es funktioniert gut unter Win7. Siehe Beispiel: paste2.org/G8tMae92
Bryc
56

Ich denke, in der Frage und in einigen Antworten gibt es ein wenig Verwirrung über die Bedeutung dieses Pseudocodes in DOS: WENN A WENN BX SONST Y. Es bedeutet nicht WENN (A und B) DANN X SONST Y, sondern in Tatsache bedeutet WENN A (WENN B DANN X SONST Y). Wenn der Test von A fehlschlägt, wird das gesamte innere Wenn-Sonst ignoriert.

Wie eine der genannten Antworten zeigt, kann in diesem Fall nur einer der Tests erfolgreich sein, sodass das 'else' nicht benötigt wird. Dies funktioniert natürlich nur in diesem Beispiel. Es ist keine allgemeine Lösung für if-else.

Es gibt viele Möglichkeiten, dies zu umgehen. Hier sind ein paar Ideen, alle sind ziemlich hässlich, aber hey, das ist (oder war zumindest) DOS!

@echo off

set one=1
set two=2

REM Example 1

IF %one%_%two%==1_1 (
   echo Example 1 fails
) ELSE IF %one%_%two%==1_2 (
   echo Example 1 works correctly
) ELSE (
    echo Example 1 fails
)

REM Example 2

set test1result=0
set test2result=0

if %one%==1 if %two%==1 set test1result=1
if %one%==1 if %two%==2 set test2result=1

IF %test1result%==1 (
   echo Example 2 fails
) ELSE IF %test2result%==1 (
   echo Example 2 works correctly
) ELSE (
    echo Example 2 fails
)

REM Example 3

if %one%==1 if %two%==1 (
   echo Example 3 fails
   goto :endoftests
)
if %one%==1 if %two%==2 (
   echo Example 3 works correctly
   goto :endoftests
)
echo Example 3 fails
)
:endoftests
gtpunch
quelle
Ich denke, die ersten beiden setbrauchen keine Prozentzeichen. sollte seinset one=1
Geoff
13

AFAIK Sie können ein if elseIn-Batch nicht wie in anderen Sprachen durchführen, es muss verschachtelt sein if.

Wenn Sie verschachtelte ifStapel verwenden, sieht Ihr Stapel so aus

IF %F%==1 IF %C%==1(
    ::copying the file c to d
    copy "%sourceFile%" "%destinationFile%"
    ) ELSE (
        IF %F%==1 IF %C%==0(
        ::moving the file c to d
        move "%sourceFile%" "%destinationFile%"
        ) ELSE (
            IF %F%==0 IF %C%==1(
            ::copying a directory c from d, /s:  boş olanlar hariç, /e:boş olanlar dahil
            xcopy "%sourceCopyDirectory%" "%destinationCopyDirectory%" /s/e
            ) ELSE (
                IF %F%==0 IF %C%==0(
                ::moving a directory
                xcopy /E "%sourceMoveDirectory%" "%destinationMoveDirectory%"
                rd /s /q "%sourceMoveDirectory%"
                )
            )
        )
    )

oder wie James vorgeschlagen hat, verketten Sie Ihre if, aber ich denke, die richtige Syntax ist

IF %F%==1 IF %C%==1(
    ::copying the file c to d
    copy "%sourceFile%" "%destinationFile%"
    )
Bali C.
quelle
1
if else, vor allem in C-ähnlichen Sprachen ist auch nur eine verschachtelte if. Sie müssen sie auch nicht mit Blöcken in Batch-Dateien verschachteln.
Joey
@ Joey Ich folge nicht ganz. Ich weiß, dass die else ifKombination nur verschachtelt ist, ifaber ich dachte nicht, dass Sie diese Schlüsselwörter zusammen in Stapeln verwenden können, wie Sie es in C-Sprachen können.
Bali C
Hmm, ich kann es immer noch nicht zum Laufen bringen, aber ich nehme dein Wort dafür, du weißt wovon du sprichst, ich werde diese Antwort als lange Version belassen :)
Bali C
Vielen Dank für Ihre Antworten, aber keine davon wurde in meinem Code nicht ausgeführt.
gleichnamig
ein anderes Beispiel: wenn 1 == 1 (Echo 1) sonst (wenn 1 == 1 (Echo 2) sonst (Echo 3))
JohnP2
1

Ich glaube, Sie können etwas wie verwenden

if ___ (

do this

) else if ___ (

do this

)
user4090570
quelle
27
Sollte die Aussage in der zweiten Bedingung nicht "mach das" sein?
Bvj
7
@bvj Nein, nein, du hast alles falsch verstanden. Es sollte do foound sein do bar.
yyny
Wenn Sie schreiben IF (test) (command) ELSE IF (test) (command), implizieren Sie IF (test) (command) ELSE (IF (test) (command)). Dies mag manchmal funktionieren, aber wenn Sie glauben, dass es sich um eine unter DOS akzeptable Programmierstruktur handelt, ist dies eine PITA, die bei einem Fehler behoben werden kann.
Tim
1

Ein bisschen spät und vielleicht immer noch gut für komplexe if-Bedingungen, da ich einen "done" -Parameter hinzufügen möchte, um eine if-then-else-Struktur beizubehalten:

set done=0
if %F%==1 if %C%==0 (set done=1 & echo found F=1 and C=0: %F% + %C%)
if %F%==2 if %C%==0 (set done=1 & echo found F=2 and C=0: %F% + %C%)
if %F%==3 if %C%==0 (set done=1 & echo found F=3 and C=0: %F% + %C%)
if %done%==0 (echo do something)
Stefane
quelle
0

IF...ELSE IF Konstrukte funktionieren sehr gut in Batchdateien, insbesondere wenn Sie nur einen bedingten Ausdruck in jeder IF-Zeile verwenden:

IF %F%==1 (
    ::copying the file c to d
    copy "%sourceFile%1" "%destinationFile1%"
) ELSE IF %F%==0 (
    ::moving the file e to f
    move "%sourceFile2%" "%destinationFile2%" )

In Ihrem Beispiel verwenden Sie das IF...AND...IFTypkonstrukt, bei dem zwei Bedingungen gleichzeitig erfüllt sein müssen. In diesem Fall können Sie weiterhin das IF...ELSE IFKonstrukt verwenden, jedoch mit zusätzlichen Klammern, um Unsicherheiten für die nächste ELSE-Bedingung zu vermeiden:

IF %F%==1 (IF %C%==1 (
    ::copying the file c to d
    copy "%sourceFile1%" "%destinationFile1%" )
) ELSE IF %F%==1 (IF %C%==0 (
    ::moving the file e to f
    move "%sourceFile2%" "%destinationFile2%"))

Das obige Konstrukt entspricht:

IF %F%==1 (
    IF %C%==1 (
    ::copying the file c to d
    copy "%sourceFile1%" "%destinationFile1%"
    ) ELSE IF %C%==0 (
    ::moving the file e to f
    move "%sourceFile2%" "%destinationFile2%"))

Die Verarbeitungssequenz von Stapelbefehlen hängt von der Analysereihenfolge von CMD.exe ab . Stellen Sie einfach sicher, dass Ihr Konstrukt dieser logischen Reihenfolge folgt, und in der Regel funktioniert es. Wenn Ihr Batch-Skript von Cmd.exe fehlerfrei verarbeitet wird, bedeutet dies, dass dies das richtige Konstrukt ist (dh von Ihrer OS Cmd.exe-Version unterstützt wird), auch wenn jemand etwas anderes gesagt hat.

sambul35
quelle
0

Hier ist mein Codebeispiel für if..else..if
, die Folgendes tun

Benutzer zur Eingabe des Prozessnamens auffordern

Wenn der Prozessname ungültig
ist, wird er an den Benutzer geschrieben

Error : The Processor above doesn't seem to be exist 

Wenn der Prozessname Dienste
ist, wird er an den Benutzer geschrieben

Error : You can't kill the Processor above 

Wenn der Prozessname gültig ist und keine Dienste
, wird er an den Benutzer geschrieben

Der Prozess wurde über beendettaskill

Also nannte ich es Process Killer.bat
Hier ist mein Code:

@echo off

:Start
Rem preparing the batch  
cls
Title Processor Killer
Color 0B
Echo Type Processor name to kill It (Without ".exe")
set /p ProcessorTokill=%=%  

:tasklist
tasklist|find /i "%ProcessorTokill%.exe">nul & if errorlevel 1 (
REM check if the process name is invalid 
Cls 
Title %ProcessorTokill% Not Found
Color 0A
echo %ProcessorTokill%
echo Error : The Processor above doesn't seem to be exist    

) else if %ProcessorTokill%==services (
REM check if the process name is services and doesn't kill it
Cls 
Color 0c
Title Permission denied 
echo "%ProcessorTokill%.exe"
echo Error : You can't kill the Processor above 

) else (
REM if the process name is valid and not services
Cls 
Title %ProcessorTokill% Found
Color 0e
echo %ProcessorTokill% Found
ping localhost -n 2 -w 1000>nul
echo Killing %ProcessorTokill% ...
taskkill /f /im %ProcessorTokill%.exe /t>nul
echo %ProcessorTokill% Killed...
)

pause>nul



REM If else if Template
REM if thing1 (
REM Command here 2 ! 
REM ) else if thing2 (
REM command here 2 !
REM ) else (
REM command here 3 !
REM )
Oimar Daif
quelle
0

Hier ist, wie ich mit anderen Situationen umgegangen bin

if %env%==dev ( 
    echo "dev env selected selected"
) else (
    if %env%==prod (
        echo "prod env selected"
    )
)

Beachten Sie, dass es nicht dasselbe ist wie der if-elseif-Block wie die anderen Programmiersprachen wie C ++ oder Java, aber es wird das tun, was Sie tun müssen

Amado Saladino
quelle