Я хотел бы знать, как перебирать каждую строку в текстовом файле с помощью командного файла Windows и последовательно обрабатывать каждую строку текста.
Как вы просматриваете каждую строку в текстовом файле с помощью командного файла Windows?
Ответы (12)
Мне нужно было обработать всю линию целиком. Вот что я нашел для работы.
for /F "tokens=*" %%A in (myfile.txt) do [process] %%A
Ключевое слово tokens со звездочкой (*) вытянет весь текст для всей строки. Если вы не поставите звездочку, она вытянет только первое слово в строке. Я предполагаю, что это связано с пробелами.
Если в пути к вашему файлу есть пробелы, вам нужно использовать usebackq. Например.
for /F "usebackq tokens=*" %%A in ("my file.txt") do [process] %%A
%%A на %A в приведенной выше команде. В противном случае вы получите %%A was unexpected at this time..
- person vadipp; 12.11.2012
for /F "tokens=*" %%A in ("myfile.txt") do echo A = %%A - ›A = myfile.txt. Есть идеи, как помешать этому?
- person will; 19.04.2016
for /F "tokens=*" %%Region in (RegionsFile.txt) do echo %%Region, и он бросал %Region was unexpected at this time
- person Shrikant Prabhu; 14.10.2016
usebackq. Например; for /F "usebackq tokens=*" %%A in ("myfile.txt") do echo A = %%A
- person Dan; 25.06.2018
usebackq в прошлом. Вы абсолютно правы в общем случае. Мой вариант использования - просто определить некоторые переменные среды на основе существующей среды set. К счастью, мне не пришлось заходить так далеко. Я рад, что вы напомнили, я оставлю комментарий, когда вернусь, чтобы расширить или клонировать скрипт.
- person will; 26.06.2018
source-d, который я читаю, с помощью for /F ... следующим образом: _3 _ b > расширение для soruce. Таким образом, у меня также может быть xxx.cmd, который запускается с ярлыка: cmd /k xxx.cmd и выполняет соответствующее: xxx.src ... Когда это необходимо.
- person will; 26.06.2018
Из справочника командной строки Windows:
Чтобы проанализировать файл, игнорируя закомментированные строки, введите:
for /F "eol=; tokens=2,3* delims=," %i in (myfile.txt) do @echo %i %j %k
Эта команда анализирует каждую строку в Myfile.txt, игнорируя строки, начинающиеся с точки с запятой, и передает второй и третий токены из каждой строки в тело FOR (токены разделяются запятыми или пробелами). В теле оператора FOR содержится ссылка на% i для получения второго токена, на% j для получения третьего токена и на% k для получения всех оставшихся токенов.
Если указанные вами имена файлов содержат пробелы, заключите текст в кавычки (например, «Имя файла»). Чтобы использовать кавычки, вы должны использовать usebackq. В противном случае кавычки интерпретируются как определение литеральной строки для синтаксического анализа.
Кстати, вы можете найти файл справки командной строки в большинстве систем Windows по адресу:
"C:\WINDOWS\Help\ntcmds.chm"
usebackq: for /f "usebackq" %%a in ("Z:\My Path Contains Spaces\xyz\abc.txt")
- person drzaus; 21.02.2014
В пакетном файле вы ДОЛЖНЫ использовать %% вместо %: (введите help for)
for /F "tokens=1,2,3" %%i in (myfile.txt) do call :process %%i %%j %%k
goto thenextstep
:process
set VAR1=%1
set VAR2=%2
set VAR3=%3
COMMANDS TO PROCESS INFORMATION
goto :EOF
Что это делает: «do call: process %% i %% j %% k» в конце команды for передает информацию, полученную в команде for, из myfile.txt в подпрограмму «process».
Когда вы используете команду for в пакетной программе, вам нужно использовать двойные знаки% для переменных.
Следующие строки передают эти переменные из команды for в подпрограмму процесса и позволяют обрабатывать эту информацию.
set VAR1=%1
set VAR2=%2
set VAR3=%3
У меня есть несколько довольно продвинутых вариантов использования этой точной настройки, которыми я готов поделиться, если потребуются дополнительные примеры. Конечно, добавьте EOL или Delims по мере необходимости.
Улучшение первого ответа «FOR / F ..»: мне нужно было вызвать execute каждый скрипт, указанный в MyList.txt, так что у меня это сработало:
for /F "tokens=*" %A in (MyList.txt) do CALL %A ARG1
--ИЛИ, если вы хотите сделать это на нескольких строках:
for /F "tokens=*" %A in (MuList.txt) do (
ECHO Processing %A....
CALL %A ARG1
)
Изменить: приведенный выше пример предназначен для выполнения цикла FOR из командной строки; из пакетного сценария необходимо добавить дополнительный%, как показано ниже:
---START of MyScript.bat---
@echo off
for /F "tokens=*" %%A in ( MyList.TXT) do (
ECHO Processing %%A....
CALL %%A ARG1
)
@echo on
;---END of MyScript.bat---
ответ @ MrKraus поучителен. Кроме того, позвольте мне добавить, что если вы хотите загрузить файл, расположенный в том же каталоге, что и пакетный файл, добавьте к имени файла префикс% ~ dp0. Вот пример:
cd /d %~dp0
for /F "tokens=*" %%A in (myfile.txt) do [process] %%A
NB:: если ваше имя файла или каталог (например, myfile.txt в приведенном выше примере) имеет пробел (например, my file.txt или c: \ Program Files), используйте:
for /F "tokens=*" %%A in ('type "my file.txt"') do [process] %%A
с ключевым словом type, вызывающим type программу, отображающую содержимое текстового файла. Если вы не хотите тратить время на вызов команды type, вам следует сменить каталог на каталог текстового файла. Обратите внимание, что тип по-прежнему требуется для имен файлов с пробелами.
Я надеюсь, что это помогает кому-то!
**cd /d %~dp0** перед циклом for. Это позволит убедиться, что вы ссылаетесь на файл в каталоге, в котором находится командный файл. Спасибо за наблюдение
- person Marvin Thobejane; 18.07.2013
type обход
- person halex; 09.03.2014
type, мне пришлось указать имя моего файла, потому что оно находится в другом каталоге, содержащем пробелы (Черт побери, Program Files). Я получаю сообщение об ошибке The system cannot find the file `type.
- person scragar; 03.07.2014
usebackq цикла for. код будет начинаться с for /F "usebackq tokens=*", тогда вы можете использовать обратные кавычки вокруг команды, одинарные кавычки вокруг строк и двойные кавычки вокруг путей к файлам.
- person robotik; 06.09.2016
Принятый ответ хорош, но имеет два ограничения.
Он отбрасывает пустые строки и строки, начинающиеся с ;
Чтобы читать строки любого контента, вам понадобится техника переключения отложенного раскрытия.
@echo off
SETLOCAL DisableDelayedExpansion
FOR /F "usebackq delims=" %%a in (`"findstr /n ^^ text.txt"`) do (
set "var=%%a"
SETLOCAL EnableDelayedExpansion
set "var=!var:*:=!"
echo(!var!
ENDLOCAL
)
Findstr используется для добавления к каждой строке номера строки и двоеточия, чтобы пустые строки больше не были пустыми.
DelayedExpansion необходимо отключить при доступе к параметру %%a, иначе восклицательные знаки ! и вставки ^ будут потеряны, поскольку в этом режиме они имеют особое значение.
Но чтобы удалить номер строки из строки, необходимо включить отложенное раскрытие. set "var=!var:*:=!" удаляет все до первого двоеточия (использование delims=: удалит также все двоеточия в начале строки, а не только один из findstr ).
endlocal снова отключает отложенное раскрытие для следующей строки.
Единственное ограничение - теперь ограничение длины строки ~ 8191, но, похоже, нет никакого способа преодолеть это.
setlocal в командной строке. Когда я запускаю код в CMD, я получаю! Var! вместо заготовок. Как исправить?
- person Zimba; 15.04.2020
Или вы можете исключить варианты в кавычках:
FOR /F %%i IN (myfile.txt) DO ECHO %%i
Вот файл bat, который я написал для выполнения всех сценариев SQL в папке:
REM ******************************************************************
REM Runs all *.sql scripts sorted by filename in the current folder.
REM To use integrated auth change -U <user> -P <password> to -E
REM ******************************************************************
dir /B /O:n *.sql > RunSqlScripts.tmp
for /F %%A in (RunSqlScripts.tmp) do osql -S (local) -d DEFAULT_DATABASE_NAME -U USERNAME_GOES_HERE -P PASSWORD_GOES_HERE -i %%A
del RunSqlScripts.tmp
Если у вас Windows семейства NT (с cmd.exe в качестве оболочки), попробуйте команду FOR / F.
Принятый ответ, использующий cmd.exe и
for /F "tokens=*" %F in (file.txt) do whatever "%F" ...
работает только для "обычных" файлов. С огромными файлами он терпит неудачу.
Для больших файлов вам может потребоваться Powershell и что-то вроде этого:
[IO.File]::ReadLines("file.txt") | ForEach-Object { whatever "$_" }
или если у вас достаточно памяти:
foreach($line in [System.IO.File]::ReadLines("file.txt")) { whatever "$line" }
Это сработало для меня с файлом 250 МБ, содержащим более 2 миллионов строк, где команда for /F ... застряла после нескольких тысяч строк.
О различиях между foreach и ForEach-Object см. Знакомство с ForEach и ForEach-Object.
(кредиты: Построчное чтение файла в PowerShell)
Модифицированные примеры здесь, чтобы перечислить наши приложения Rails на Heroku - спасибо!
cmd /C "heroku list > heroku_apps.txt"
find /v "=" heroku_apps.txt | find /v ".TXT" | findstr /r /v /c:"^$" > heroku_apps_list.txt
for /F "tokens=1" %%i in (heroku_apps_list.txt) do heroku run bundle show rails --app %%i
Полный код здесь.
for /f "tokens=1" %%i in ('find /v "=" heroku_apps.txt ^| find /v ".TXT" ^| findstr /r /v /c:"^$"') do... (обратите внимание на добавление ^, используемых для выхода из канала, так что он передается в for, а не напрямую в командный процессор)
- person user66001; 03.02.2013
Чтобы распечатать все строки текстового файла из командной строки (с delayedExpansion):
set input="path/to/file.txt"
for /f "tokens=* delims=[" %i in ('type "%input%" ^| find /v /n ""') do (
set a=%i
set a=!a:*]=]!
echo:!a:~1!)
Работает с ведущими пробелами, пустыми строками, пробельными строками.
Проверено на Win 10 CMD
]]] из строк, второй образец отбрасывает пустые строки и строки, начинающиеся с пробела
- person jeb; 02.02.2020
delims, если какие-либо строки в текстовом файле начинаются с ], например. заменить на какой-либо символ, которого нет, или на управляющий символ, например backspace или колокольчик; они обычно не встречаются в текстовых файлах. Причина delims=] - удалить заполнители, созданные командой /n из find, чтобы сохранить пустые строки.
- person Zimba; 02.02.2020
This bang ! disappears. Кстати, delim=[ вам не нужен, потому что set a=!a:*]=]! тоже удалил бы его, а echo:!a:~1! не требуется, вы можете заменить замену на set a=!a:*]=!
- person jeb; 06.10.2020
delim=[ заключалась в том, чтобы сохранить строки только с пробелами, которые должны быть удалены с помощью set a=!a:*]=]!, поскольку они не являются частью содержимого. Причина set a=!a:*]=]!: set a=!a:*]=! не работает при первоначальном тестировании. Оба работают теперь в окончательном коде с правильным форматом echo.
- person Zimba; 06.10.2020
The caret ^ is removed, but the bang ! stays, Use !cd! or %cd% и \..\..\..\windows\system32\calc.exe
- person jeb; 07.10.2020
calc.exe у меня работает нормально. Строки каретки и cd могут быть исправлены с помощью подстановки ", ^ & (в моем случае), но, как и в других реализациях CMD, потребуется специализированное решение для ОС, на которой он работает. Кстати, проблема !cd! распространяется на любую допустимую переменную, например. %windir% или !windir!.
- person Zimba; 07.10.2020
calc.exe зависит от вашего каталога Windows и от того, в каком каталоге вы запускаете код (тот же диск и глубина каталога), но ее можно легко решить с помощью echo(!var!. Остальные проблемы решить нетривиально, так как это поведение отложенного расширения.
- person jeb; 07.10.2020
