batch file - exist - ¿Cómo usar if-else structure en un archivo por lotes?
if en batch (7)
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 programa 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%"
)
AFAIK no se puede hacer un if else
en un lote como se puede en otros idiomas, tiene que ser anidado if
es.
Usando anidado 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 sintaxis correcta es
IF %F%==1 IF %C%==1(
::copying the file c to d
copy "%sourceFile%" "%destinationFile%"
)
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 )
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
Creo que puedes usar algo como
if ___ (
do this
) else if ___ (
do this
)
Tu sintaxis 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
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.