275

Windows バッチ ファイルを使用してテキスト ファイルの各行をループし、テキストの各行を連続して処理する方法を知りたいです。

4

12 に答える 12

345

ライン全体をまとめて処理する必要がありました。これが私がうまくいったことです。

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

アスタリスク (*) を含む tokens キーワードは、行全体のすべてのテキストを取得します。アスタリスクを入れないと、行の最初の単語だけが取り出されます。スペースと関係があると思います。

TechNet のコマンドについて


ファイル パスにスペースが含まれている場合は、usebackq. 例えば。

for /F "usebackq tokens=*" %%A in ("my file.txt") do [process] %%A
于 2008-10-02T18:33:46.133 に答える
60

Windows コマンド ライン リファレンスから:

コメント行を無視してファイルを解析するには、次のように入力します。

for /F "eol=; tokens=2,3* delims=," %i in (myfile.txt) do @echo %i %j %k

このコマンドは Myfile.txt の各行を解析し、セミコロンで始まる行を無視して、各行の 2 番目と 3 番目のトークンを FOR 本体に渡します (トークンはコンマまたはスペースで区切られます)。FOR ステートメントの本体は、%i を参照して 2 番目のトークンを取得し、%j を参照して 3 番目のトークンを取得し、%k を参照して残りのすべてのトークンを取得します。

指定したファイル名にスペースが含まれている場合は、テキストを引用符で囲みます ("File Name" など)。引用符を使用するには、usebackq を使用する必要があります。それ以外の場合、引用符は解析するリテラル文字列を定義するものとして解釈されます。

ところで、ほとんどの Windows システムのコマンドライン ヘルプ ファイルは次の場所にあります。

 "C:\WINDOWS\Help\ntcmds.chm"
于 2008-10-01T02:06:49.930 に答える
37

バッチファイルでは、代わりに使用する必要があります: (Type )%%%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

これが何をするか: for コマンドの最後にある "do call :process %%i %%j %%k" は、for コマンドで取得した情報を myfile.txt から "process" 'サブルーチン' に渡します。

バッチ プログラムで for コマンドを使用している場合は、変数に二重の % 記号を使用する必要があります。

次の行は、これらの変数を for コマンドからプロセスの「サブルーチン」に渡し、この情報を処理できるようにします。

set VAR1=%1
 set VAR2=%2
 set VAR3=%3

この正確なセットアップのかなり高度な使用法がいくつかあります。さらに例が必要な場合は、喜んで共有します。もちろん、必要に応じて EOL または Delims を追加してください。

于 2010-05-04T14:39:16.580 に答える
30

最初の「FOR /F ..」の回答の改善: 私がしなければならなかったことは、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---
于 2012-01-23T18:36:46.937 に答える
18

受け入れられた答えは良いですが、2 つの制限があります。
空行とで始まる行を削除します;

コンテンツの行を読むには、遅延拡張トグル技術が必要です。

@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 ですが、これを克服する方法はないようです。

于 2013-07-18T12:52:01.560 に答える
14

または、オプションを引用符で囲んで除外することもできます。

FOR /F %%i IN (myfile.txt) DO ECHO %%i
于 2009-08-12T13:18:09.143 に答える
9

以下は、フォルダー内のすべての 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
于 2008-10-01T02:08:09.647 に答える
7

NT ファミリの Windows (cmd.exeシェルとしての Windows)を使用している場合は、FOR /F コマンドを試してください。

于 2008-10-01T02:03:54.790 に答える
1

Heroku で Rails アプリを一覧表示するために、ここにサンプルを変更しました - ありがとう!

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

完全なコードはこちら

于 2013-01-11T19:27:38.153 に答える