1

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

SET /P FOO=<"foo.txt"

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

Когда я выполняю скрипт, я получаю следующий вывод:

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

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

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

2 ответа2

3

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

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!
)

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .