Tengo una pregunta sobre if - else estructura en un archivo por lotes. Cada comando se ejecuta individualmente, pero no pude usar los bloques "if - else" de manera segura, por lo que estas partes de mi programa no funcionan. ¿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%"
)
batch-file
if-statement
epónimo
fuente
fuente
{}
botón; ayuda a que las publicaciones sean más legibles y evita algunos problemas con el marcado. En respuesta a su pregunta, ¡lo hace ahora! Al escribir una pregunta, hay una vista previa a continuación para que pueda ver cómo se verá una vez publicada.Respuestas:
Su sintaxis es incorrecta. No puedes usar
ELSE IF
. Parece que realmente no lo necesitas de todos modos. Simplemente use múltiplesIF
declaraciones:Gran referencia de archivo por lotes: http://ss64.com/nt/if.html
fuente
&&
en múltiplesif
condiciones, ¿ves mi sintaxis alternativa?IF condition1 IF condition 2
ELSE IF
? Funciona bien con Win7. Ver ejemplo: paste2.org/G8tMae92Creo 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 ELSE Y, pero en hecho significa SI A (SI B ENTONCES X OTRA Y). Si la prueba de A falla, entonces todo el if-else interno será ignorado.
Como se mencionó en una de las respuestas, en este caso solo una de las pruebas puede tener éxito, por lo que no se necesita el 'else', pero por supuesto eso solo funciona en este ejemplo, no es una solución general para hacer if-else.
Hay muchas maneras de evitar esto. Aquí hay algunas ideas, todas son bastante feas, pero bueno, ¡esto es (o al menos era) DOS!
fuente
set
no necesitan signos de porcentaje; debería serset one=1
AFAIK no puede hacer un
if else
lote como puede hacerlo en otros idiomas, tiene que estar anidadoif
.Usando anidados
if
su lote se vería asío como sugirió James, encadene el suyo
if
, sin embargo, creo que la sintaxis adecuadafuente
if else
, especialmente en lenguajes tipo C, también está anidadoif
. Tampoco tiene que anidarlos con bloques en archivos por lotes.else if
combo es solo un anidado,if
pero no pensé que pudieras usar esas palabras clave juntas en lotes, como puedes hacerlo en lenguajes C.Creo que puedes usar algo como
fuente
do foo
ydo bar
.IF (test) (command) ELSE IF (test) (command)
, estás insinuandoIF (test) (command) ELSE (IF (test) (command))
. Esto puede funcionar a veces, pero si crees que es una estructura de programación real aceptable en DOS, entonces será una PITA para solucionar problemas cuando falla.Un poco tarde y tal vez aún sea bueno para las complejas condiciones if, porque me gustaría agregar un parámetro "hecho" para mantener una estructura if-then-else:
fuente
IF...ELSE IF
Las construcciones funcionan muy bien en archivos por lotes, en particular cuando usa solo una expresión condicional en cada línea IF:En su ejemplo, utiliza el
IF...AND...IF
tipo de construcción, donde se deben cumplir 2 condiciones simultáneamente. En este caso, aún puede usar laIF...ELSE IF
construcción, pero con paréntesis adicionales para evitar la incertidumbre para la siguiente condición ELSE:La construcción anterior es equivalente a:
La secuencia de procesamiento de los comandos por lotes depende del orden de análisis de CMD.exe . Solo asegúrese de que su construcción siga ese orden lógico y, por regla general, funcionará. Si su script por lotes es procesado por Cmd.exe sin errores, significa que esta es la construcción correcta (es decir, compatible con su versión de OS Cmd.exe), incluso si alguien dijo lo contrario.
fuente
Aquí está mi código Ejemplo para if..else..if
que hacen lo siguiente
Solicitar al usuario el nombre del proceso
Si el nombre del proceso no es válido,
entonces se escribe al usuario
si el nombre del proceso es servicios,
entonces es escribir al usuario
si el nombre del proceso es válido y no servicios,
entonces es escribir al usuario
el proceso ha sido eliminado a través de
taskill
así que lo llamé Process killer.bat
Aquí está mi código:
fuente
así es como manejé si más si la situación
Tenga en cuenta que no es lo mismo que el bloque if-elseif como los otros lenguajes de programación como C ++ o Java, pero hará lo que necesita hacer
fuente