web-dev-qa-db-fra.com

Comment utiliser la structure if-else dans un fichier batch?

J'ai une question sur la structure if-else dans un fichier batch. Chaque commande est exécutée individuellement, mais je ne peux pas utiliser les blocs "if-else" en toute sécurité, de sorte que ces parties de mon programme ne fonctionnent pas. Comment puis-je faire fonctionner ces pièces? Je vous remercie.

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

Votre syntaxe est incorrecte. Vous ne pouvez pas utiliser ELSE IF. Il semble que vous n'en ayez pas vraiment besoin de toute façon. Utilisez simplement plusieurs instructions IF:

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

Excellente référence de fichier batch: http://ss64.com/nt/if.html

104
James Hill

Je pense que dans la question et dans certaines réponses, il y a un peu de confusion au sujet de la signification de ce pseudocode dans DOS: SI UN SI IF BX AUTRE Y. Cela ne signifie pas SI A et B) ALORS X AUTRE UN Y, mais dans fait signifie que si A (si B alors X autre que Y). Si le test de A échoue, alors l'intégralité du if intérieur sera ignorée.

Comme l’a mentionné l’une des réponses, dans ce cas, un seul des tests peut réussir. Le "else" n’est donc pas nécessaire, mais bien sûr, cet exemple ne fonctionne que dans cet exemple. Ce n’est pas une solution générale pour effectuer if-else.

Il y a beaucoup de façons de contourner cela. Voici quelques idées, toutes sont assez laides mais bon, c'est (ou du moins c'était) 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
53
gtpunch

Autant que je sache, vous ne pouvez pas faire un if else en batch comme vous pouvez le faire dans d'autres langues, il doit être imbriqué en if.

En utilisant if imbriqué, votre lot ressemblerait à

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

ou comme James a suggéré, enchaînez votre if ', mais je pense que la syntaxe appropriée est

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

Un peu tard et peut-être encore bon pour les conditions if complexes, car j'aimerais ajouter un paramètre "done" pour conserver une structure 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)
1
Stefane

Je crois que vous pouvez utiliser quelque chose comme

if ___ (

do this

) else if ___ (

do this

)
1
user4090570

Les constructions IF...ELSE IF fonctionnent très bien dans les fichiers de commandes, en particulier lorsque vous utilisez une seule expression conditionnelle sur chaque ligne 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%" )

Dans votre exemple, vous utilisez la construction de type IF...AND...IF, où 2 conditions doivent être remplies simultanément. Dans ce cas, vous pouvez toujours utiliser la construction IF...ELSE IF, mais avec des parenthèses supplémentaires pour éviter toute incertitude quant à la prochaine condition 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%"))

La construction ci-dessus est équivalente à:

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 séquence de traitement des commandes par lot dépend de ordre d’analyse CMD.exe . Assurez-vous simplement que votre construction respecte cet ordre logique et qu’elle fonctionnera en règle générale. Si votre script de traitement par lots est traité par Cmd.exe sans erreur, cela signifie que cette construction est correcte (prise en charge par la version de votre système d'exploitation Cmd.exe), même si quelqu'un a dit le contraire.

0
sambul35

Voici mon code Exemple pour if..else..if
qui font ce qui suit

Demander à l'utilisateur le nom du processus

Si le nom du processus est invalide
Ensuite, écrivez à l'utilisateur

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

si le nom du processus est services
Ensuite, écrivez à l'utilisateur

Error : You can't kill the Processor above 

si le nom du processus est valide et non services
Ensuite, écrivez à l'utilisateur

le processus a été tué via taskill

donc je l'ai appelé Process killer.bat
Voici mon 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 )
0
Omar