Por que o Windows converte o operador “=” para “= 0”?

1

Eu tenho o seguinte arquivo em lotes:

SET /P FOO=<"foo.txt"

Esta é uma tentativa de ler o conteúdo de foo.txt na variável FOO , conforme sugerido em Como ler o conteúdo do arquivo em uma variável em um arquivo de lote? . Este método já funcionou bem para mim.

Quando executo o script, recebo a seguinte saída:

SET /P FOO= 0<"foo.txt"

Este não é apenas um erro de exibição, o valor não é lido na variável. Por que isso acontece? Como resolvo isso?

Estou vendo isso em várias máquinas, problemas de EOL ou codificação não parecem ser a fonte.

    
por Der Hochstapler 07.03.2018 / 13:47

2 respostas

3

Tem certeza de que não funciona? Tentei replicar o problema e eis o que recebo:

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:\>

Portanto, ele adiciona 0< , mas ainda aplica os dados de dentro do arquivo à variável.

    
por 07.03.2018 / 14:02
2

Para responder à pergunta inicial, como @grawity apontado , =< é apenas um pequeno formato para = <0 , que é perfeitamente sintaxe e funciona como esperado (uma vez testado corretamente ).

Portanto, não há nada de errado com a saída e foi apenas um obstáculo quando eu estava investigando um problema diferente.

Esse problema está 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, esperava que a saída fosse Pass , já que deveria ter sido lida de foo.txt , mas a saída é Fail . Eu suspeitava que isso se devesse à sintaxe "desconfigurada".

No entanto, como @Joey apontado , esse comportamento está relacionado a expansão atrasada .

Para que o código acima funcione, 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!
)
    
por 07.03.2018 / 14:51