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

<p>я хотел бы знать, как циклически проходить через каждую строку в текстовом файле, используя пакетный файл windows, и обрабатывать каждую строку текста последовательно.</p>

<p>посты ниже очень помогли, но не сделали то, что я сказал в своем вопросе, где мне нужно было обработать всю строку в целом. вот что я нашел для работы.</p><pre><code>for /f "tokens=*" %%a in (myfile.txt) do [process] %%a </code></pre><p>ключевое слово токены со звездочкой (*) вытянет весь текст для всей строки. если вы не введете звездочку, она вытянет только первое слово в строке. я предполагаю, что это связано с пробелами. </p><p> <a href="http://technet.microsoft.com/en-us/library/bb490909.aspx">для команды на technet</a> </p><p>я ценю все посты!</p><hr><p>если в пути к файлу есть пробелы, вам нужно использовать <code>usebackq</code>. например.</p><pre><code>for /f "usebackq tokens=*" %%a in ("my file.txt") do [process] %%a </code></pre>

<p>из справки командной строки windows:</p><p>чтобы проанализировать файл, игнорируя закомментированные строки, введите:</p><pre><code>for /f "eol=; tokens=2,3* delims=," %i in (myfile.txt) do @echo %i %j %k </code></pre><p>эта команда анализирует каждую строку в myfile.txt, игнорируя строки, начинающиеся с точки с запятой и передавая второй и третий токены из каждой строки в тело for (токены разделяются запятыми или пробелами). тело оператора for ссылается на% i, чтобы получить второй токен,% j, чтобы получить третий токен, и% k, чтобы получить все оставшиеся токены. </p><p>если имена файлов, которые вы вводите, содержат пробелы, используйте кавычки вокруг текста (например, «имя файла»). чтобы использовать кавычки, вы должны использовать usebackq. в противном случае кавычки интерпретируются как определение литеральной строки для анализа.</p><p>кстати, вы можете найти файл справки командной строки в большинстве систем windows по адресу:</p><pre><code> "c:\windows\help\ntcmds.chm" </code></pre>

<p>в пакетном файле вы<strong>должны</strong>использовать <code>%%</code> вместо <code>%</code>: (введите <code>help for</code>)</p><pre><code>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 </code></pre><p>что это делает: "do call: process %% i %% j %% k" в конце команды for передает информацию, полученную в команде for, из myfile.txt в подпрограмму "process" ,.</p><p>когда вы используете команду for в пакетной программе, вам нужно использовать двойные знаки% для переменных.</p><p>в следующих строках эти переменные передаются из команды for в подпрограмму процесса и позволяют обрабатывать эту информацию.</p><pre><code>set var1=%1 set var2=%2 set var3=%3 </code></pre><p>у меня есть довольно продвинутые способы использования этой точной настройки, которыми я хотел бы поделиться, если понадобятся дополнительные примеры. добавьте в eol или delims по мере необходимости, конечно.</p>

<p>улучшение первого ответа «for/f ..»: мне нужно было вызвать execute каждый скрипт, указанный в mylist.txt, чтобы он работал для меня:</p><pre><code>for /f "tokens=*" %a in (mylist.txt) do call %a arg1 </code></pre><p>- или, если вы хотите сделать это в несколько строк: </p><pre><code>for /f "tokens=*" %a in (mulist.txt) do ( echo processing %a.... call %a arg1 ) </code></pre><p>правка: приведенный выше пример для выполнения цикла for из командной строки; из пакетного скрипта необходимо добавить дополнительный%, как показано ниже:</p><pre><code>---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--- </code></pre>

<p>@ mrkraus's <a href="https://stackoverflow.com/a/163873/1358924">ответ</a> поучительно. далее, позвольте мне добавить это <strong>, если вы хотите загрузить файл, расположенный в том же каталоге</strong>, что и пакетный файл, добавьте к имени файла префикс% ~ dp0. вот пример:</p><pre><code>cd /d %~dp0 for /f "tokens=*" %%a in (myfile.txt) do [process] %%a </code></pre><p><strong>nb:</strong>: если в имени вашего файла или каталога (например, myfile.txt в приведенном выше примере) есть пробел (например, «my file.txt» или «c:\program files»), используйте:</p><pre><code>for /f "tokens=*" %%a in ('type "my file.txt"') do [process] %%a </code></pre><p>с ключевым словом <strong>type</strong>, вызывающим программу <code>type</code>, которая отображает содержимое текстового файла. если вы не хотите испытывать накладные расходы при вызове команды type, вы должны изменить каталог на каталог текстового файла. обратите внимание, что тип по-прежнему требуется для имен файлов с пробелами.</p><p>я надеюсь, что это помогает кому-то!</p>

<p>принятый ответ хорош, но имеет два ограничения.<br> он отбрасывает пустые строки и строки, начинающиеся с <code>;</code></p><p>чтобы читать строки любого контента, вам нужна техника переключения с отложенным расширением. </p><pre><code>@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 ) </code></pre><p>findstr используется для добавления к каждой строке префикса с номером строки и двоеточием, поэтому пустые строки больше не являются пустыми. </p><p>delayedexpansion необходимо отключить при доступе к параметру <code>%%a</code>, иначе восклицательные знаки <code>!</code> и символы <code>^</code> будут потеряны, так как они имеют особые значения в этом режиме. </p><p>но для удаления номера строки из строки необходимо включить отложенное расширение.<br> <code>set "var=!var:*:=!"</code> удаляет все до первого двоеточия (использование <code>delims=:</code> удаляет также все двоеточия в начале строки, а не только один из findstr).<br> endlocal снова отключает отложенное расширение для следующей строки.</p><p>единственным ограничением в настоящее время является ограничение длины линии ~ 8191, но, кажется, нет способа преодолеть это. </p>

<p>или вы можете исключить опции в кавычках:</p><pre><code>for /f %%i in (myfile.txt) do echo %%i </code></pre>

<p>вот файл bat, который я написал для выполнения всех сценариев sql в папке:</p><pre><code>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 </code></pre>

<p>если у вас windows nt-семейства (одна с <code>cmd.exe</code> в качестве оболочки), попробуйте <a href="http://technet.microsoft.com/library/bb490909.aspx">команда for/f</a> .</p>

<p>модифицированные примеры здесь, чтобы перечислить наши приложения rails на heroku - спасибо!</p><pre><code>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 полный код <a href="https://gist.github.com/4512454/">здесь .

принятый ответ с использованием cmd.exe и for /f "tokens=" %f in (file.txt) do whatever "%f" ... работает только для "нормальных" файлов. это терпит неудачу с огромными файлами.для больших файлов вам может понадобиться использовать powershell и что-то вроде этого:[io.file]::readlines("file.txt") | foreach-object { whatever "$\_" } </code></pre><p>или если у вас достаточно памяти:</p><pre><code>foreach($line in [system.io.file]::readlines("file.txt")) { whatever "$line" } </code></pre><p>это сработало для меня с файлом размером 250 мб, содержащим более 2 миллионов строк, где команда <code>for /f ...</code> застряла после нескольких тысяч строк.</p><p>о различиях между <code>foreach</code> и <code>foreach-object</code> см. <a href="https://blogs.technet.microsoft.com/heyscriptingguy/2014/07/08/getting-to-know-foreach-and-foreach-object/">знакомство с foreach и foreach-object</a> .</p><p>(авторы: <a href="https://stackoverflow.com/questions/33511772/read-file-line-by-line-in-powershell">читать файл построчно в powershell</a> )</p>