Eu tenho o seguinte arquivo em lote:
SET /P FOO=<"foo.txt"
Esta é uma tentativa de ler o conteúdo de foo.txt
na variável FOO
, conforme sugerido emComo ler o conteúdo do arquivo em uma variável em um arquivo em lote?
. Este método já funcionou bem para mim.
Quando executo o script, obtenho a seguinte saída:
SET /P FOO= 0<"foo.txt"
Isto não é apenas um erro de exibição, o valor não é lido na variável. Por que isso acontece? Como faço para resolver isso?
Estou vendo isso em várias máquinas, EOL ou problemas de codificação não parecem ser a fonte.
Responder1
Tem certeza de que não funciona? Tentei replicar o problema e aqui está o que obtive:
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:\>
Então ele adiciona 0<
, mas ainda aplica os dados de dentro do arquivo à variável.
Responder2
Para responder à pergunta inicial, como @grawityapontou, =<
é apenas uma forma abreviada de = <0
, que tem uma sintaxe perfeitamente adequada e realmente funciona conforme o esperado (depois de testá-locorretamente).
Portanto, não há nada de errado com a saída e foi apenas uma pista falsa quando eu estava investigando um problema diferente.
Esse problema estava relacionado a um trecho de código, semelhante a este:
@ECHO OFF
SETLOCAL
SET TEST=Fail
ECHO Pass>foo.txt
IF ERRORLEVEL 0 (
SET /P TEST=<foo.txt
ECHO %TEST%
)
Ao executar isso, eu esperava que a saída fosse Pass
, pois deveria ter sido lida no foo.txt
, mas a saída é Fail
. Suspeitei que isso se devesse à sintaxe "mutilada".
No entanto, como @Joeyapontou, esse comportamento está relacionadoexpansão atrasada.
Para fazer o código acima funcionar, ele deve ser reescrito como:
@ECHO OFF
SETLOCAL ENABLEDELAYEDEXPANSION
SET TEST=Fail
ECHO Pass>foo.txt
IF ERRORLEVEL 0 (
SET /P TEST=<foo.txt
ECHO !TEST!
)