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%"
)
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
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
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%"
)
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)
Je crois que vous pouvez utiliser quelque chose comme
if ___ (
do this
) else if ___ (
do this
)
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.
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 )