Как я могу загрузить содержимое текстового файла в переменную пакетного файла?

StackOverflow https://stackoverflow.com/questions/134001

Вопрос

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

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


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

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

echo %content%
EndLocal
Это было полезно?

Решение

Использование 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.Если вы не знаете русского языка, вы все равно можете воспользоваться предоставленными фрагментами кода.

Другие советы

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

set /p VAR1=<test.txt

установить /?|найти "/P"

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

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

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

set content=
for /f "delims=" %%i in ('type text.txt') do set content=!content! %%i

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

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

Таким образом, вы также ограничены размером текстовых файлов менее 8 тыс.(Вы не можете создать ни одного env var размером более 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

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

set FileContents=

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

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

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

for /f "delims=" %%i in (count.txt) do set c=%%i
echo %c%
pause
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top