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.



Modified text is an extract of the original Stack Overflow Documentation
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow