Я хотел бы знать, как перебирать каждую строку в текстовом файле с помощью командного файла Windows и последовательно обрабатывать каждую строку текста.
Как вы прокручиваете каждую строку в текстовом файле, используя пакетный файл Windows?
Ответ 1
Посты ниже помогли значительно, но не сделали того, что я сказал в своем вопросе, где мне нужно было обрабатывать всю линию в целом. Вот что я нашел для работы.
for /F "tokens=*" %%A in (myfile.txt) do [process] %%A
Ключевое слово tokens со звездочкой (*) вытащит весь текст для всей строки. Если вы не помещаете звездочку, она вытащит только первое слово на линии. Я предполагаю, что это связано с пробелами.
Я ценю все сообщения!
Ответ 2
В командной строке 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"
Ответ 3
В пакетном файле вы ДОЛЖНЫ использовать %%
вместо %
: (Тип 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 %% я %% j %% k" в конце команды for передает информацию, полученную в команде "from" из myfile.txt, в подпрограмму "process".
Когда вы используете команду for в пакетной программе, вам нужно использовать знаки double% для переменных.
Следующие строки передают эти переменные из команды for в подпрограмму процесса и позволяют обрабатывать эту информацию.
set VAR1=%1
set VAR2=%2
set VAR3=%3
У меня есть довольно продвинутое использование этой точной установки, которую я хотел бы поделиться, если нужны дополнительные примеры. Добавьте в свой EOL или Delims, если необходимо, конечно.
Ответ 4
Улучшение первого ответа "FOR/F..": Я должен был выполнить выполнение каждого script, указанного в 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 из командной строки; из пакета script необходимо добавить дополнительный%, как показано ниже:
---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---
Ответ 5
@MrKraus answer является поучительным. Кроме того, позвольте мне добавить, что , если вы хотите загрузить файл, расположенный в том же каталоге, в качестве командного файла, префикс имени файла% ~ 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
, которая отображает содержимое текстового файла. Если вы не хотите страдать от накладных расходов при вызове команды типа, вы должны изменить каталог в каталог текстового файла. Обратите внимание, что тип по-прежнему требуется для имен файлов с пробелами.
Надеюсь, это поможет кому-то!
Ответ 6
Принятый ответ хорош, но имеет два ограничения.
Он оставляет пустые строки и строки, начинающиеся с ;
Чтобы читать строки любого контента, вам нужна техническая поддержка с задержкой расширения.
@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
, иначе будут потеряны восклицательные знаки !
и carets ^
, так как они имеют специальные значения в этом режиме.
Но чтобы удалить номер строки из строки, необходимо включить замедленное расширение. set "var=!var:*:=!"
удаляет все до первого двоеточия (используя delims=:
удаляет также все двоеточия в начале строки, а не только одну из findstr).
Endlocal снова отключает замедленное расширение для следующей строки.
Единственным ограничением является теперь ограничение длины строки ~ 8191, но, похоже, нет способа преодолеть это.
Ответ 7
Или вы можете исключить опции в кавычках:
FOR /F %%i IN (myfile.txt) DO ECHO %%i
Ответ 8
Вот файл 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
Ответ 9
Если у вас есть NT-семейство Windows (один с cmd.exe
в качестве оболочки), попробуйте команду FOR/F.
Ответ 10
Модифицированные примеры здесь, чтобы перечислить наши приложения 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
Полный код здесь.