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

136

J'ai une question sur la structure if - else dans un fichier batch. Chaque commande s'exécute individuellement, mais je ne peux pas utiliser les blocs "if - else" en toute sécurité, donc 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%"
    )
éponyme
la source
Ma question est-elle lue clairement? Je l'ai lu ligne par ligne mais il me semble côte à côte.
éponyme
4
Bonjour, Bienvenue dans Stack Overflow! Pour créer un bloc de code, vous pouvez mettre en évidence le texte pertinent et cliquer sur le {}bouton; cela aide à rendre les messages plus lisibles et évite certains problèmes avec le balisage. En réponse à votre question, c'est le cas maintenant! Lorsque vous rédigez une question, vous trouverez un aperçu ci-dessous afin que vous puissiez voir à quoi elle ressemblera une fois publiée.
Ben
1
Merci donc pour votre explication. Je vais utiliser ces méthodes.
éponyme

Réponses:

111

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 IFinstructions:

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 référence de fichier de commandes: http://ss64.com/nt/if.html

James Hill
la source
2
Veuillez me corriger si je me trompe, mais je ne pense pas que vous pouvez utiliser &&dans plusieurs ifconditions, voir ma syntaxe alternative?
Bali C
si mes conditions if sont comme ceci: "IF% F% == 0" s'exécute en toute sécurité mais quand j'ai ajouté && il ne s'exécute pas. Comment puis-je utiliser deux conditions dans un if?
éponyme le
1
@aprogrammer, regardez mon exemple. Si vous avez plusieurs conditions, utilisezIF condition1 IF condition 2
James Hill
J'avais essayé votre réponse mais je ne pouvais pas l'exécuter mais j'ai réessayé et modifié mon code et je l'ai exécuté. La dernière situation d'une partie de mon code est la suivante: IF% F% == 1 IF% C% == 1 (:: copie du fichier c vers d copie "% sourceFile%" "% destinationFile%") ELSE (IF % F% == 1 IF% C% == 0 (:: déplacement du fichier c vers d déplacer "% sourceFile%" "% destinationFile%")) ELSE (IF% F% == 0 IF% C% == 1 (:: copie d'un répertoire c à partir de d, / s: boş olanlar hariç, / e: boş olanlar dahil xcopy "% sourceCopyDirectory%" "% destinationCopyDirectory%" / s / e))
éponyme
4
Que voulez-vous dire que vous ne pouvez pas utiliser ELSE IF? Cela fonctionne bien sous Win7. Voir exemple: paste2.org/G8tMae92
bryc
56

Je pense que dans la question et dans certaines des réponses, il y a un peu de confusion sur la signification de ce pseudo-code sous DOS: IF A IF BX ELSE Y. Cela ne signifie pas IF (A et B) THEN X ELSE Y, mais dans fait signifie 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 mentionnées, dans ce cas, un seul 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 if-else.

Il existe de nombreuses façons de contourner ce problème. Voici quelques idées, toutes sont assez moche mais bon, c'est (ou du moins é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
gtpunch
la source
Je pense que les deux premiers setn'ont pas besoin de signes de pourcentage; devrait êtreset one=1
Geoff
13

AFAIK vous ne pouvez pas faire un if elselot comme vous pouvez le faire dans d'autres langues, il doit être imbriqué if.

En utilisant des imbriqués 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:  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 l'a suggéré, enchaînez les vôtres 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%"
    )
Bali C
la source
1
if else, en particulier dans les langages de type C est juste un imbriqué ifaussi. Vous n'avez pas non plus à les imbriquer avec des blocs dans des fichiers de commandes.
Joey
@Joey je ne suis pas tout à fait. Je sais que le else ifcombo est juste un imbriqué, ifmais je ne pensais pas que vous pourriez utiliser ces mots-clés ensemble par lots comme vous pouvez le faire dans les langages C.
Bali C
Hmm je n'arrive toujours pas à le faire fonctionner, mais je vous crois sur parole, vous savez de quoi vous parlez, je laisserai cette réponse en version longue :)
Bali C
Merci pour vos réponses, mais aucune d'entre elles ne fonctionnait dans mon code.
éponyme
un autre exemple: if 1 == 1 (echo 1) else (if 1 == 1 (echo 2) else (echo 3))
JohnP2
1

Je pense que vous pouvez utiliser quelque chose comme

if ___ (

do this

) else if ___ (

do this

)
utilisateur4090570
la source
27
L'énoncé de la deuxième condition ne devrait-il pas être «faire ça»?
bvj
7
@bvj Non, non, vous avez tout faux. Cela devrait être do fooet do bar.
yyny
Lorsque vous écrivez IF (test) (command) ELSE IF (test) (command), vous impliquez IF (test) (command) ELSE (IF (test) (command)). Cela peut fonctionner parfois, mais si vous pensez que c'est une structure de programmation réelle acceptable sous DOS, alors ce sera un PITA à dépanner en cas d'échec.
Tim
1

Un peu tard et peut-être encore bon pour des conditions if complexes, car je voudrais 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)
Stefane
la source
0

IF...ELSE IF Les constructions fonctionnent très bien dans les fichiers batch, en particulier lorsque vous n'utilisez qu'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 IF...AND...IFconstruction de type, où 2 conditions doivent être remplies simultanément. Dans ce cas, vous pouvez toujours utiliser la IF...ELSE IFconstruction, mais avec des parenthèses supplémentaires pour éviter l'incertitude pour 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 lots dépend de l'ordre d'analyse de CMD.exe . Assurez-vous simplement que votre construction suit cet ordre logique et, en règle générale, cela fonctionnera. Si votre script batch est traité par Cmd.exe sans erreur, cela signifie qu'il s'agit de la construction correcte (c'est-à-dire prise en charge par votre version OS Cmd.exe), même si quelqu'un a dit le contraire.

sambul35
la source
0

Voici mon exemple de code pour if..else..if
qui fait ce qui suit

Demander à l'utilisateur le nom du processus

Si le nom du processus n'est pas valide
, il est écrit à l'utilisateur

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

si le nom du processus est services
alors il est écrit à l'utilisateur

Error : You can't kill the Processor above 

si le nom du processus est valide et non des services
alors il est écrit à l'utilisateur

le processus a été tué viataskill

alors 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 )
Oimar Daif
la source
0

voici comment j'ai géré si sinon si situation

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

Notez que ce n'est pas le même que le bloc if-elseif que les autres langages de programmation comme C ++ ou Java mais il fera ce que vous devez faire

Amado Saladino
la source