Tengo el siguiente archivo por lotes:
SET /P FOO=<"foo.txt"
Este es un intento de leer el contenido de foo.txt
en la variable FOO
, como se sugiere en¿Cómo leer el contenido del archivo en una variable en un archivo por lotes?
. Este método me ha funcionado bien anteriormente.
Cuando ejecuto el script, obtengo el siguiente resultado:
SET /P FOO= 0<"foo.txt"
Esto no es sólo un error de visualización, el valor no se lee en la variable. ¿Por qué pasó esto? ¿Cómo resuelvo esto?
Veo esto en varias máquinas, los problemas de EOL o de codificación no parecen ser la fuente.
Respuesta1
¿Estás seguro de que no funciona? Intenté replicar el problema y esto es lo que obtengo:
D:\>notepad test.bat //i've put SET /P FOO=<"foo.txt" inside it
D:\>echo asdf > foo.txt
D:\>test.bat
D:\>SET /P FOO= 0<"foo.txt"
D:\>echo %FOO%
asdf
D:\>
Entonces agrega 0<
pero aún aplica los datos desde el interior del archivo a la variable.
Respuesta2
Para responder a la pregunta inicial, como @grawityseñaló, =<
es solo una forma abreviada de = <0
, que tiene una sintaxis perfectamente buena y realmente funciona como se esperaba (una vez que lo pruebescorrectamente).
Así que no hay nada de malo en el resultado y fue solo una pista falsa cuando estaba investigando un problema diferente.
Ese problema estaba relacionado con un fragmento de código similar a este:
@ECHO OFF
SETLOCAL
SET TEST=Fail
ECHO Pass>foo.txt
IF ERRORLEVEL 0 (
SET /P TEST=<foo.txt
ECHO %TEST%
)
Al ejecutar esto, esperaba que el resultado fuera Pass
, ya que debería haberse leído desde foo.txt
, pero el resultado es Fail
. Sospeché que esto se debe a la sintaxis "destrozada".
Sin embargo, como @Joeyseñaló, este comportamiento está relacionado conexpansión retrasada.
Para que el código anterior funcione, debe reescribirse como:
@ECHO OFF
SETLOCAL ENABLEDELAYEDEXPANSION
SET TEST=Fail
ECHO Pass>foo.txt
IF ERRORLEVEL 0 (
SET /P TEST=<foo.txt
ECHO !TEST!
)