Как загрузить содержимое текстового файла в переменную пакетного файла?
Мне нужно иметь возможность загружать все содержимое текстового файла и загружать его в переменную для дальнейшей обработки.
Как я могу это сделать?
Вот что я сделал благодаря ответу Романа Одайского.
SetLocal EnableDelayedExpansion
set content=
for /F "delims=" %%i in (test.txt) do set content=!content! %%i
echo %content%
EndLocal
Ответы
Ответ 1
Используйте for
, что-то вроде строк:
set content=
for /f "delims=" %%i in ('filename') do set content=%content% %%i
Возможно, вам придется делать setlocal enabledelayedexpansion
и/или использовать !content!
, а не %content%
. Я не могу проверить, так как у меня нет MS Windows рядом (и я желаю вам того же: -).
Лучший пакетный файл-черная магическая ссылка, о которой я знаю, находится в http://www.rsdn.ru/article/winshell/batanyca.xml. Если вы не знаете русский язык, вы все равно можете использовать предоставленные фрагменты кода.
Ответ 2
Если ваша команда set поддерживает/p-переключатель, вы можете направить вход таким образом.
set /p VAR1=<test.txt
set/? | найти "/P"
Переключатель/P позволяет вам установить значение переменной в строку введенный пользователем. Показывает указанную строку promptString перед считывая строку ввода. Команда promptString может быть пуста.
Это имеет дополнительное преимущество для работы с незарегистрированными типами файлов (к которому не относится принятый ответ).
Ответ 3
Вы можете использовать:
set content=
for /f "delims=" %%i in ('type text.txt') do set content=!content! %%i
Ответ 4
Вы можете получить выгоду (прямо или косвенно и позднее), прочитав эту страницу (легко читайте, понятное и сжатое).
Получение файлов данных в переменную среды (env var)
Я смог добиться успеха с помощью "метода 4b", который дает мне надежду, что в конечном итоге у меня будет успех с 4a.
Ответ 5
Можете ли вы определить дальнейшую обработку?
Вы можете использовать цикл for, чтобы это сделать, но нет простого способа вставить CR/LF в переменную среды, поэтому вы будете иметь все в одной строке. (вы можете обойти это в зависимости от того, что вам нужно делать.)
Таким образом, вы также ограничены текстовыми файлами размером менее 8 килобайт. (Вы не можете создать один env var больше, чем около 8k.)
Предполагаемое предложение цикла for - это то, что вам нужно. Вы обрабатываете файл по одной строке за раз:
(используйте %i
в командной строке %%i
в пакетном файле)
for /f "tokens=1 delims=" %%i in (file.txt) do echo %%i
более продвинутый:
for /f "tokens=1 delims=" %%i in (file.txt) do call :part2 %%i
goto :fin
:part2
echo %1
::do further processing here
goto :eof
:fin
Ответ 6
Создайте файл под названием "SetFile.bat", который содержит следующую строку с отсутствием возврата каретки в конце ее...
set FileContents=
Затем в вашем пакетном файле сделайте что-то вроде этого...
@echo off
copy SetFile.bat + %1 $tmp$.bat > nul
call $tmp$.bat
del $tmp$.bat
% 1 - имя вашего входного файла, а% FileContents% будет содержать содержимое входного файла после вызова. Это будет работать только в одном файле (т.е. Файл без возврата каретки). Вы можете вырезать/заменить возврат каретки из файла перед вызовом% tmp%.bat, если необходимо.
Ответ 7
for /f "delims=" %%i in (count.txt) do set c=%%i
echo %c%
pause