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

Я хотел бы знать, как перебирать каждую строку в текстовом файле с помощью командного файла Windows и последовательно обрабатывать каждую строку текста.

Ответ 1

Посты ниже помогли значительно, но не сделали того, что я сказал в своем вопросе, где мне нужно было обрабатывать всю линию в целом. Вот что я нашел для работы.

for /F "tokens=*" %%A in (myfile.txt) do [process] %%A

Ключевое слово tokens со звездочкой (*) вытащит весь текст для всей строки. Если вы не помещаете звездочку, она вытащит только первое слово на линии. Я предполагаю, что это связано с пробелами.

Для команды в TechNet

Я ценю все сообщения!

Ответ 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

Полный код здесь.