У меня есть следующий пакетный файл:
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!
)