Как я могу загрузить содержимое текстового файла в переменную пакетного файла?
-
02-07-2019 - |
Вопрос
Мне нужно иметь возможность загрузить все содержимое текстового файла и загрузить его в переменную для дальнейшей обработки.
Как я могу это сделать?
Вот что я сделал благодаря ответу Романа Одайского.
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