157 votes

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 s'exécute individuellement, mais je n'ai pas pu utiliser les blocs "if - else" en toute sécurité, de sorte que ces parties de mon programme ne fonctionnent pas. Comment puis-je faire en sorte que ces parties soient exécutées ? Merci.

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:  bos olanlar hariç, /e:bos 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%"
    )

0 votes

Ma question est-elle lue clairement ? Je l'ai lue ligne par ligne mais il me semble que c'est côte à côte.

4 votes

Bonjour, Bienvenue sur Stack Overflow ! Pour créer un bloc de code, vous pouvez mettre en surbrillance le texte concerné et cliquer sur l'icône {} Cela permet de rendre les messages plus lisibles et d'éviter certains problèmes de balisage. Pour répondre à votre question, c'est le cas maintenant ! Lorsque vous écrivez une question, un aperçu est affiché en dessous afin que vous puissiez voir à quoi elle ressemblera une fois publiée.

1 votes

Je vous remercie donc pour votre explication. Je vais utiliser cette méthode.

126voto

James Hill Points 27532

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. Il suffit d'utiliser plusieurs IF déclarations :

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:  bos olanlar hariç, /e:bos 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 référence en matière de fichiers batch : http://ss64.com/nt/if.html

3 votes

Corrigez-moi si je me trompe, mais je ne pense pas que vous puissiez utiliser && dans de multiples if conditions, voir ma syntaxe alternative ?

0 votes

Si mes conditions if sont comme ceci : "IF %F%==0" s'exécutent sans problème mais lorsque j'ai ajouté &&, elles ne s'exécutent pas. Comment puis-je utiliser deux conditions dans un if ?

1 votes

@aprogrammer, Regardez mon exemple. Si vous avez plusieurs conditions, utilisez IF condition1 IF condition 2

60voto

gtpunch Points 131

Je pense que dans la question et dans certaines réponses, il y a un peu de confusion sur la signification de ce pseudo-code dans DOS : IF A IF B X ELSE Y. Cela ne signifie pas IFA et B) THEN X ELSE Y, mais en fait IF A( IF B THEN X ELSE Y). Si le test de A échoue, alors l'ensemble du if-else interne sera ignoré.

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

Il existe de nombreuses façons de contourner ce problème. Voici quelques idées, toutes sont assez laides mais hé, 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

0 votes

Je pense que les deux premiers set n'ont pas besoin de signes de pourcentage ; devraient être set one=1

13voto

Bali C Points 12771

AFAIK, vous ne pouvez pas faire un if else en batch comme vous pouvez le faire dans d'autres langages, il doit être imbriqué if 's.

Utilisation de l'imbrication if 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:  bos olanlar hariç, /e:bos 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 l'a suggéré, enchaînez vos if mais je pense que la syntaxe correcte est la suivante

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

1 votes

if else surtout dans les langages de type C, n'est qu'une imitation de if aussi. Il n'est pas non plus nécessaire de les imbriquer avec des blocs dans les fichiers batch.

0 votes

@Joey Je ne vous suis pas vraiment. Je sais que le else if est juste une combinaison imbriquée if mais je ne pensais pas que l'on pouvait utiliser ces mots-clés ensemble en batch comme on peut le faire en langage C.

0 votes

Hmm je n'arrive toujours pas à le faire fonctionner, mais je vous crois sur parole, vous savez de quoi vous parlez, je vais laisser cette réponse en version longue :)

6voto

Amado Saladino Points 320

Voici comment j'ai géré la situation "if else if

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

Note il ne s'agit pas d'un bloc if-elseif comme dans les autres langages de programmation tels que C++ ou Java, mais il fera ce dont vous avez besoin.

2voto

user4090570 Points 11

Je crois que vous pouvez utiliser quelque chose comme

if ___ (

do this

) else if ___ (

do this

)

31 votes

L'énoncé de la deuxième condition ne devrait-il pas être "faire cela" ?

8 votes

@bvj Non, non, vous avez tout faux. Ça devrait être do foo y do bar .

0 votes

Lorsque vous écrivez IF (test) (command) ELSE IF (test) (command) vous sous-entendez que IF (test) (command) ELSE (IF (test) (command)) . Cela peut parfois fonctionner, mais si vous pensez qu'il s'agit d'une structure de programmation réelle acceptable sous DOS, vous risquez d'avoir du mal à trouver une solution en cas d'échec.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X