¿Cómo usar if – else structure en un archivo por lotes?

Tengo una pregunta sobre if – else structure en un archivo por lotes. Cada comando se ejecuta individualmente, pero no pude usar bloques “if – else” de forma segura para que estas partes de mi progtwig no funcionen. ¿Cómo puedo hacer que estas partes funcionen? Gracias.

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

Tu syntax es incorrecta No puedes usar ELSE IF . Parece que en realidad no lo necesitas de todos modos. Simplemente use múltiples declaraciones 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%" ) 

Gran referencia de archivo por lotes: http://ss64.com/nt/if.html

Creo que en la pregunta y en algunas de las respuestas hay un poco de confusión sobre el significado de este pseudocódigo en DOS: IF A IF BX ELSE Y. No significa IF (A y B) THEN X YSE Y, pero en hecho significa IF A (SI B ENTONCES X YS). Si la prueba de A falla, entonces se ignorará todo el if-else interno.

Como una de las respuestas mencionadas, en este caso solo una de las pruebas puede tener éxito, por lo que no se necesita ‘else’, pero por supuesto que solo funciona en este ejemplo, no es una solución general para hacer if-else.

Hay muchas formas de evitar esto. Aquí hay algunas ideas, todas son bastante feas pero ¡oye, esto es (o al menos fue) 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 

AFAIK no se puede hacer un if else en un lote como se puede en otros idiomas, tiene que ser nested if es.

Usando nested if su lote se vería

 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 como James sugirió, encadene su if ‘s, sin embargo, creo que la syntax correcta es

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

Creo que puedes usar algo como

 if ___ ( do this ) else if ___ ( do this ) 

Un poco tarde y quizás aún sea bueno para condiciones if complejas, porque me gustaría agregar un parámetro “hecho” para mantener una estructura 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) 

IF...ELSE IF construcciones IF...ELSE IF funcionan muy bien en archivos por lotes, en particular cuando se utiliza una sola expresión condicional en cada línea 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%" ) 

En su ejemplo, usted usa IF...AND...IF type construct, donde 2 condiciones deben cumplirse simultáneamente. En este caso, puede usar IF...ELSE IF constructed, pero con paréntesis adicionales para evitar la incertidumbre para la siguiente condición 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 construcción anterior es 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 secuencia de procesamiento de los comandos por lotes depende del orden de análisis de CMD.exe . Solo asegúrate de que tu construcción siga ese orden lógico y, como regla general, funcionará. Si Cmd.exe procesa su script por lotes sin errores, significa que esta es la construcción correcta (es decir, compatible con su versión de OS Cmd.exe), incluso si alguien dijera lo contrario.

Aquí está mi código Ejemplo para if..else … si
que hacen lo siguiente

Preguntar al usuario por el nombre del proceso

Si el nombre del proceso no es válido
Entonces es escribir para el usuario

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

si el nombre del proceso es servicios
Entonces es escribir para el usuario

 Error : You can't kill the Processor above 

si el nombre del proceso es válido y no servicios
Entonces es escribir para el usuario

el proceso ha sido asesinado a través de taskill

así que lo llamé Process killer.bat
Aquí está mi Código:

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