Почему Windows преобразует оператор «=

Почему Windows преобразует оператор «=

У меня есть следующий пакетный файл:

SET /P FOO=<"foo.txt"

Это попытка прочитать содержимое foo.txtв переменную FOO, как предложено вКак прочитать содержимое файла в переменную пакетного файла? . Этот метод раньше работал у меня отлично.

При запуске скрипта я получаю следующий вывод:

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

Это не только ошибка отображения, значение не считывается в переменную. Почему это происходит? Как это решить?

Я наблюдаю это на нескольких машинах, но, похоже, проблема не в EOL или кодировке.

решение1

Вы уверены, что это не работает? Я попробовал воспроизвести проблему, и вот что я получаю:

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

Таким образом, он добавляет 0<, но все равно применяет данные из файла к переменной.

решение2

Чтобы ответить на первоначальный вопрос, как @grawityуказал, =<это просто краткая форма для = <0, которая имеет прекрасный синтаксис и на самом деле работает так, как и ожидалось (после того, как вы это протестируетеправильно).

Так что с выводом все в порядке, и это был просто отвлекающий маневр, когда я исследовал другую проблему.

Эта проблема была связана с фрагментом кода, похожим на этот:

@ECHO OFF
SETLOCAL
SET TEST=Fail
ECHO Pass>foo.txt

IF ERRORLEVEL 0 (
SET /P TEST=<foo.txt
ECHO %TEST%
)

При запуске этого я ожидал вывода Pass, так как это должно было быть прочитано из foo.txt, но вывод был Fail. Я подозревал, что это из-за «искалеченного» синтаксиса.

Однако, как сказал @Joeyуказал, это поведение связано сотсроченное расширение.

Чтобы приведенный выше код заработал, его следует переписать так:

@ECHO OFF
SETLOCAL ENABLEDELAYEDEXPANSION
SET TEST=Fail
ECHO Pass>foo.txt

IF ERRORLEVEL 0 (
SET /P TEST=<foo.txt
ECHO !TEST!
)

Связанный контент