Я хотел бы знать, как циклически проходить через каждую строку в текстовом файле, используя пакетный файл Windows, и обрабатывать каждую строку текста последовательно.
windows
batch-file
Мистер краус
источник
источник
%%A
с%A
в команде выше. В противном случае вы получите%%A was unexpected at this time.
.for /F "tokens=*" %%A in ("myfile.txt") do echo A = %%A
->A = myfile.txt
. Есть идеи, как это помешать?Из справки командной строки Windows:
Чтобы проанализировать файл, игнорируя закомментированные строки, введите:
Эта команда анализирует каждую строку в Myfile.txt, игнорируя строки, начинающиеся с точки с запятой и передавая второй и третий токены из каждой строки в тело FOR (токены разделяются запятыми или пробелами). Тело оператора FOR ссылается на% i, чтобы получить второй токен,% j, чтобы получить третий токен, и% k, чтобы получить все оставшиеся токены.
Если имена файлов, которые вы вводите, содержат пробелы, используйте кавычки вокруг текста (например, «Имя файла»). Чтобы использовать кавычки, вы должны использовать usebackq. В противном случае кавычки интерпретируются как определение литеральной строки для анализа.
Кстати, вы можете найти файл справки командной строки в большинстве систем Windows по адресу:
источник
usebackq
» :for /f "usebackq" %%a in ("Z:\My Path Contains Spaces\xyz\abc.txt")
В пакетном файле вы ДОЛЖНЫ использовать
%%
вместо%
: (Типhelp for
)Что это делает: «do call: process %% i %% j %% k» в конце команды for передает информацию, полученную в команде for из myfile.txt, в «process» «подпрограмму».
Когда вы используете команду for в пакетной программе, вам нужно использовать двойные знаки% для переменных.
В следующих строках эти переменные передаются из команды for в подпрограмму процесса и позволяют обрабатывать эту информацию.
У меня есть довольно продвинутые способы использования этой точной настройки, которыми я хотел бы поделиться, если понадобятся дополнительные примеры. Добавьте в EOL или Delims по мере необходимости, конечно.
источник
Улучшение первого ответа «FOR / F ..»: мне нужно было вызвать execute каждый скрипт, указанный в MyList.txt, чтобы он работал для меня:
- ИЛИ, если вы хотите сделать это в несколько строк:
Изменить: приведенный выше пример для выполнения цикла FOR из командной строки; из пакетного скрипта необходимо добавить дополнительный%, как показано ниже:
источник
@ MrKraus ответ поучителен. Далее, позвольте мне добавить, что если вы хотите загрузить файл, расположенный в том же каталоге, что и пакетный файл, добавьте к имени файла префикс% ~ dp0. Вот пример:
NB :: Если ваше имя файла или каталога (например, myfile.txt в приведенном выше примере) имеет пробел (например, «my file.txt» или «c: \ Program Files»), используйте:
, с ключевым словом type, вызывающим
type
программу, которая отображает содержимое текстового файла. Если вы не хотите испытывать накладные расходы при вызове команды type, вы должны изменить каталог на каталог текстового файла. Обратите внимание, что тип по-прежнему требуется для имен файлов с пробелами.Я надеюсь, что это поможет кому-то!
источник
**cd /d %~dp0**
перед циклом for. Это позволит убедиться, что вы ссылаетесь на файл в каталоге, в котором находится пакетный файл. Спасибо за наблюдениеtype
Walkaroundtype
работу вокруг, мне пришлось процитировать мое имя файла, потому что оно находится в другом каталоге, который содержит пробелы (Черт возьмиProgram Files
). Я получаю сообщение об ошибкеThe system cannot find the file `type.
Принятый ответ хорош, но имеет два ограничения.
Он пропускает пустые строки и строки, начинающиеся с
;
Чтобы прочитать строки любого контента, вам нужна техника переключения с отложенным расширением.
Findstr используется для добавления к каждой строке префикса с номером строки и двоеточием, поэтому пустые строки больше не являются пустыми.
DelayedExpansion должен быть отключен при доступе к
%%a
параметру, иначе восклицательные знаки!
и каретки^
будут потеряны, так как они имеют особое значение в этом режиме.Но для удаления номера строки из строки необходимо включить отложенное расширение.
set "var=!var:*:=!"
удаляет все до первого двоеточия (использованиеdelims=:
удаляет также все двоеточия в начале строки, а не только один из findstr).Endlocal снова отключает отложенное расширение для следующей строки.
Единственным ограничением в настоящее время является ограничение длины линии ~ 8191, но, кажется, нет способа преодолеть это.
источник
setlocal
в командной строке. Когда я запускаю код на CMD, я получаю! Var! вместо пробелов. Как исправить?Или вы можете исключить опции в кавычках:
источник
Вот файл bat, который я написал для выполнения всех сценариев SQL в папке:
источник
Если у вас есть NT-семейства Windows (один с в
cmd.exe
качестве оболочки), попробуйте команду FOR / F .источник
Принятый ответ
cmd.exe
и использование иработает только для "нормальных" файлов. Это терпит неудачу с огромными файлами.
Для больших файлов вам может понадобиться использовать Powershell и что-то вроде этого:
или если у вас достаточно памяти:
Это сработало для меня с файлом размером 250 МБ, содержащим более 2 миллионов строк, где
for /F ...
команда застряла после нескольких тысяч строк.Различия между
foreach
иForEach-Object
см. В разделах Знакомство с ForEach и ForEach-Object .(Авторы: Читать файл построчно в PowerShell )
источник
Модифицированные примеры, чтобы перечислить наши приложения Rails на Heroku - спасибо!
Полный код здесь .
источник
for /f "tokens=1" %%i in ('find /v "=" heroku_apps.txt ^| find /v ".TXT" ^| findstr /r /v /c:"^$"') do...
(обратите внимание на добавление^
символов, используемых для выхода из канала, чтобы они передавались в,for
а не напрямую в командный процессор)Чтобы напечатать все строки в текстовом файле из командной строки (с delayedExpansion):
Работает с ведущими пробелами, пустыми строками, пробелами.
Проверено на Win 10 CMD
источник
]]]
из строк, второй образец отбрасывает пустые строки и строки, начинающиеся с пробелаdelims
если любые строки в текстовом файле начинаются с,]
например. заменить на некоторый символ, который не делает, или управляющий символ, такой как backspace или bell; они обычно не встречаются в текстовых файлах. Причинаdelims=]
заключается в удалении заполнителей , созданные/n
изfind
команды , чтобы сохранить пустые строки.