Как я могу загрузить содержимое текстового файла в переменную пакетного файла? - PullRequest
31 голосов
/ 25 сентября 2008

Мне нужно иметь возможность загрузить все содержимое текстового файла и загрузить его в переменную для дальнейшей обработки.

Как я могу это сделать?


Вот что я сделал благодаря ответу Романа Одайского.

SetLocal EnableDelayedExpansion
set content=
for /F "delims=" %%i in (test.txt) do set content=!content! %%i

echo %content%
EndLocal

Ответы [ 6 ]

50 голосов
/ 01 февраля 2013

Если ваша команда set поддерживает ключ / p, то вы можете передать данные таким образом.

set /p VAR1=<test.txt

набор /? | найти "/ P"

Параметр / P позволяет установить значение переменной в строку ввод, введенный пользователем. Отображает указанную строку promptString до чтение строки ввода. Аргумент promptString может быть пустым.

Это дает дополнительное преимущество работы с незарегистрированными типами файлов (а принятый ответ - нет).

14 голосов
/ 25 сентября 2008

Используйте 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 голосов
/ 25 сентября 2008

Вы можете использовать:

set content=
for /f "delims=" %%i in ('type text.txt') do set content=!content! %%i
2 голосов
/ 25 сентября 2008

Можете ли вы определить дальнейшую обработку?

Вы можете использовать цикл for, чтобы почти сделать это, но нет простого способа вставить CR / LF в переменную окружения, поэтому все будет в одной строке. (вы можете обойти это в зависимости от того, что вам нужно сделать.)

Таким образом, вы можете использовать не более 8 000 текстовых файлов. (Вы не можете создать одну переменную env, размер которой превышает 8 КБ.)

Предложение Билла о цикле 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
0 голосов
/ 04 августа 2014
for /f "delims=" %%i in (count.txt) do set c=%%i
echo %c%
pause
0 голосов
/ 25 сентября 2008

Создайте файл с именем «SetFile.bat», который содержит следующую строку с без возврата каретки в конце ...

set FileContents=

Тогда в вашем командном файле сделайте что-то вроде этого ...

   @echo off
   copy SetFile.bat + %1 $tmp$.bat > nul
   call $tmp$.bat
   del $tmp$.bat

% 1 - это имя вашего входного файла, а% FileContents% будет содержать содержимое входного файла после вызова. Это будет работать только для однострочного файла (то есть файла, не содержащего возврат каретки). Вы можете удалить / заменить возврат каретки из файла перед вызовом% tmp% .bat, если это необходимо.

...