Come usare la struttura if - else in un file batch?


136

Ho una domanda sulla struttura if - else in un file batch. Ogni comando viene eseguito singolarmente, ma non ho potuto utilizzare i blocchi "if - else" in modo sicuro, quindi queste parti del mio programma non funzionano. Come posso far funzionare queste parti? Grazie.

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%"
    )

La mia domanda è letta chiaramente? L'ho letto riga per riga ma mi sembra fianco a fianco.
omonimo il

4
Ciao, benvenuto in Stack Overflow! Per creare un blocco di codice è possibile evidenziare il testo pertinente e fare clic sul {}pulsante; aiuta a rendere i post più leggibili ed evita alcuni problemi con il markup. In risposta alla tua domanda, lo fa ora! Quando scrivi una domanda c'è un'anteprima qui sotto in modo da poter vedere come apparirà una volta pubblicata.
Ben

1
Quindi grazie per la tua spiegazione. Userò questi metodi.
omonimo

Risposte:


111

La tua sintassi non è corretta. Non puoi usare ELSE IF. Sembra che non ne abbia davvero bisogno comunque. Usa semplicemente più IFistruzioni:

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%"
    )

Grande riferimento ai file batch: http://ss64.com/nt/if.html


2
Per favore, correggimi se sbaglio, ma non penso che tu possa usare &&in più ifcondizioni, vedi la mia sintassi alternativa?
Bali C,

se le mie condizioni if ​​sono così: "IF% F% == 0" funziona in modo sicuro ma quando ho aggiunto && non funziona. Come posso usare due condizioni in un if?
omonimo

1
@aprogrammer, guarda il mio esempio. Se hai più condizioni, usaIF condition1 IF condition 2
James Hill il

Avevo provato la tua risposta, ma non avrei potuto eseguirla, ma ho provato di nuovo e modificato il mio codice per l'esecuzione. L'ultima situazione di alcune parti del mio codice è la seguente: IF% F% == 1 IF% C% == 1 (:: copia del file da c a d copia "% sourceFile%" "% destinationFile%") ELSE (IF % F% == 1 IF% C% == 0 (:: spostamento del file c in d sposta "% sourceFile%" "% destinationFile%")) ELSE (IF% F% == 0 IF% C% == 1 (:: copia di una directory c da d, / s: boş olanlar hariç, / e: boş olanlar dahil xcopy "% sourceCopyDirectory%" "% destinationCopyDirectory%" / s / e))
omonimo

4
Cosa vuoi dire che non puoi usare ELSE IF? Funziona bene con Win7. Vedi esempio: paste2.org/G8tMae92
bryc

56

Penso nella domanda e in alcune delle risposte c'è un po 'di confusione sul significato di questo pseudocodice in DOS: IF A IF BX ELSE Y. Non significa IF (A e B) ALLORA X ELSE Y, ma in infatti significa IF A (IF B THEN X ELSE Y). Se il test di A fallisce, allora l'intero if-else interno verrà ignorato.

Come una delle risposte menzionate, in questo caso solo uno dei test può avere successo, quindi "altro" non è necessario, ma ovviamente funziona solo in questo esempio, non è una soluzione generale per fare if-else.

Ci sono molti modi per aggirare questo. Ecco alcune idee, sono tutte piuttosto brutte ma ehi, questo è (o almeno era) 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

Penso che i primi due setnon abbiano bisogno dei segni di percentuale; dovrebbe essereset one=1
Geoff

13

AFAIK non puoi farne un if elsebatch come puoi in altre lingue, deve essere nidificato if.

Usando nidificato ifil tuo batch sarebbe simile

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%"
                )
            )
        )
    )

o come James ha suggerito, concatenate le vostre if, comunque penso che sia la sintassi corretta

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

1
if else, specialmente nei linguaggi simili a C, è solo un nidificato if. Non è necessario nidificarli con blocchi nei file batch.
Joey,

@Joey, non lo seguo del tutto. So che la else ifcombo è solo un nidificato, ifma non pensavo che potresti usare quelle parole chiave insieme in batch come puoi fare in linguaggi C.
Bali C,

Hmm non riesco ancora a farlo funzionare, ma prenderò la tua parola per quello, sai di cosa stai parlando, lascerò questa risposta come una versione lunga :)
Bali C

Grazie per le tue risposte, ma nessuna di esse non è stata eseguita nel mio codice.
omonimo

un altro esempio: if 1 == 1 (echo 1) else (if 1 == 1 (echo 2) else (echo 3))
JohnP2

1

Credo che tu possa usare qualcosa come

if ___ (

do this

) else if ___ (

do this

)

27
L'affermazione nella seconda condizione non dovrebbe essere "fallo"?
bvj,

7
@bvj No, no, hai sbagliato tutto. Dovrebbe essere do fooe do bar.
yyny,

Quando scrivi IF (test) (command) ELSE IF (test) (command), stai insinuando IF (test) (command) ELSE (IF (test) (command)). Questo può funzionare a volte, ma se ritieni che sia una struttura di programmazione effettiva accettabile in DOS, sarà una PITA per la risoluzione dei problemi quando fallisce.
Tim

1

Un po 'in ritardo e forse ancora buono per if-condition complesse, perché vorrei aggiungere un parametro "done" per mantenere una struttura if-then-else:

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)

0

IF...ELSE IF i costrutti funzionano molto bene nei file batch, in particolare quando si utilizza solo un'espressione condizionale su ciascuna riga IF:

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%" )

Nel tuo esempio usi il IF...AND...IFtipo costrutto, dove 2 condizioni devono essere soddisfatte contemporaneamente. In questo caso puoi ancora usare il IF...ELSE IFcostrutto, ma con parentesi extra per evitare incertezza per la prossima condizione ELSE:

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%"))

Il costrutto sopra è equivalente a:

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%"))

La sequenza di elaborazione dei comandi batch dipende dall'ordine di analisi CMD.exe . Assicurati solo che il tuo costrutto segua quell'ordine logico e di norma funzionerà. Se lo script batch viene elaborato da Cmd.exe senza errori, significa che questo è il costrutto corretto (ovvero supportato dalla versione del tuo sistema operativo Cmd.exe), anche se qualcuno ha detto diversamente.


0

Ecco il mio esempio di codice per if..else..if
che procede come segue

Richiedi utente per Nome processo

Se il nome del processo non è valido,
allora è scrivere all'utente

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

se il nome del processo è services
Quindi è scrivere all'utente

Error : You can't kill the Processor above 

se il nome del processo è valido e non servizi
Quindi è scrivere all'utente

il processo è stato interrotto tramitetaskill

così l'ho chiamato Process killer.bat
Ecco il mio codice:

@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 )

0

ecco come ho gestito se altro se la situazione

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

Nota che non è lo stesso del blocco if-elseif degli altri linguaggi di programmazione come C ++ o Java, ma farà quello che devi fare

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.