Estoy intentando usar esta línea en un archivo por lotes.
If NOT "%1%"=="foo" (echo %bar% Text. >> "%USERPROFILE%\Desktop\Log File.txt")
y cuando lo ejecuto me sale esto
) was unexpected at this time.
C:\> If NOT "ARGUMENTBARUSERPROFILE\Desktop\Log File.txt")
(ARGUMENTO = cualquier argumento/parámetro que utilicé al ejecutar el archivo por lotes)
Probé todo tipo de variaciones, incluido cambiar "Log File.txt" por "LogFile.txt" y eliminar las comillas alrededor de la ruta, y lo limité al hecho de que se rompe cada vez que hay una %
señal (por intentar hacer eco una variable) o dos puntos (desde la ruta a la derecha de >>
). No tengo idea de cuál es el problema de los dos puntos, pero %
parece que es codicioso y lee la línea en el sentido de que la variable que se está probando es la cadena concatenada completa de todos los contenidos encerrados por un %
par más el resto de la línea (presumiblemente porque no hay ningún operador después, por lo que continúa hasta EOL, donde se encuentra entre paréntesis). Entonces parece que es necesario escapar de algo, hay algo más que debo cambiar o simplemente no es posible.
Me doy cuenta de que podría simplemente poner la declaración de eco en otra línea como esta
If NOT... (
echo...
)
pero prefiero hacerlo en una sola línea, en parte porque es más limpio, pero sobre todo porque tengo curiosidad y me gusta resolver cosas como esta, y odio cuando no puedo.
Por cierto, la expresión retrasada está habilitada.
EDITAR: según el comentario de @AFH, lo probé solo en un archivo por lotes y descubrí que esto
@echo on
setlocal enableDelayedExpansion
SET bar=test
If NOT "%1%"=="foo" (echo %bar% Text. >> "%USERPROFILE%\Desktop\Log File.txt")
no da el error pero poniendocualquier cosadespués (por ejemplo, endlocal
en la línea siguiente o incluso en una línea siguiente en blanco).Sin embargo, usar %1
en lugar de %1%
, como lo menciona ADH, lo solucionó, así que ese era el problema. Por tanto esto está solucionado.
Respuesta1
No he podido reproducir tu error exacto, pero puedo confirmarlo.observación de AFHque los parámetros de la línea de comandos son (por ejemplo, , , etc.) y no , por lo que su comando debe ser%n
%1
%2
%n%
If NOT "%1"=="foo" (echo %bar% Text. >> "%USERPROFILE%\Desktop\Log File.txt")
Creo que puedo arrojar algo de luz sobre lo que sucede cuando se incluye el extra %
. CMD parece analizar las líneas de comando en busca de parámetros y variables antes de hacer cualquier otra cosa, y utiliza un analizador muy simple. Cuando se encuentra con un %
,
- si el siguiente carácter es un dígito, entonces es un parámetro posicional;
%n
- si es algo más, es una variable ( ), y
%name%
todohasta el siguiente%
es elname
. Supongo que se vuelve muy confuso si no hay una coincidencia%
.
Así es como se analiza su comando:
If NOT "%1%"=="foo" (echo %bar% Text. >> "%USERPROFILE%\Desktop\Log File.txt")
\/\---------------/ \-----------/ \---------------------- ...?
Piensa que "=="foo" (echo
y Text. >> "
son nombres de variables, mientras que bar
y USERPROFILE
es texto literal. Por ejemplo, ejecutar su comando con un argumento de "hola" generó este mensaje de error similar al que recibió:
La sintaxis del comando es incorrecta. C:(directorio actual)> Si NO es "hellobarUSERPROFILE\Desktop\Log File.txt")