Por que o Windows converte o operador "=

Por que o Windows converte o operador "=

Eu tenho o seguinte arquivo em lote:

SET /P FOO=<"foo.txt"

Esta é uma tentativa de ler o conteúdo de foo.txtna 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!
)

informação relacionada