batch-file
Mejores prácticas
Buscar..
Introducción
Este tema se centrará en las cosas que uno debe (no es obligatorio) hacer en un archivo por lotes. El uso de estas "mejores prácticas" puede mejorar el efecto y la función de un archivo por lotes.
Citas
La mayoría de los scripts de lotes en línea vienen con muchos problemas de cotización.
Ejemplos y soluciones
Ejemplo A
if %var%==abc echo Test
Este código funciona: cuando el contenido de %var%
no contiene espacio ni otros caracteres especiales. Ahora supongamos que %var%
contiene 1 espacio en blanco. Ahora cmd.exe
ve:
if ==abc echo Test
Esto causaría un error porque cmd.exe
no entiende esta sintaxis.
Solución A
if "%var%"=="abc" echo Test
Al usar comillas, cmd.exe
ve el %var%
completo (incluido el espacio y los caracteres especiales) como una sola cadena normal. Sin embargo, este no es el método de comparación más seguro. El más seguro usa echo
, pipe
y findstr
.
Ejemplo B
cd C:\User\Spaced Name\Spaced FileName.txt
cd
solo cambiaría el directorio a C:\User\Spaced
, ya que cd
solo acepta un argumento de ruta.
Solución B
Simplemente agregando comillas alrededor de la ruta, el problema se resolvería.
cd "C:\User\Spaced Name\Spaced FileName.txt"
También hay algunos ejemplos que funcionan mejor usando comillas, como el set /a
declaración, etc. Pero cuando se trabaja en cadenas que contienen espacios o caracteres especiales, generalmente es muy seguro usar comillas.
Código de espagueti
El código de Spaghetti significa un fragmento de código que usa muchas estructuras, a menudo confusas. Tales como GOTO
s, excepciones y código inconsistente.
Ejemplos y soluciones
Ejemplo A
@echo off
set /a counter=0
:Loop
set /a counter=%counter% + 1
echo %counter%
if %counter% equ 10 goto :exit
goto :Loop
:exit
Este programa viene con muchos saltos, lo que nos hace más difícil saber qué está haciendo exactamente el script.
Solución A
@echo off
for /l %%G in (0,1,10) echo %%G
Usando menos GOTO
, redujimos mucho la cantidad de código, y podemos enfocarnos en el código real.
Ejemplo B
Considere las siguientes afirmaciones.
:endGame
if %player1Score% gtr %player2Score% goto :player1wins
if %player1Score% lss %player2Score% goto :player2wins
goto :tie
:player1wins
echo player 1 wins
goto :eof
:player2wins
echo player 2 wins
goto :eof
:tie
echo tie
goto :eof
Este fragmento de código requiere un montón de instrucciones goto
y puede ser confuso para depurar. Para simplificar estas declaraciones, podemos usar el comando de call
. Aquí está el script anterior en una mejor condición.
:endGame
if %player1Score% gtr %player2Score% call :message player 1 wins
if %player1Score% lss %player2Score% call :message player 2 wins
if %player1Score% equ %player2Score% call :message tie
goto :eof
:message
echo %*
goto :eof
Ambos scripts generan exactamente el mismo resultado, pero el nuevo script es mucho más corto y claro.