回答:
以下の投稿は大いに役立ちましたが、行全体を処理する必要がある場所で私の質問に述べたとおりにはいきませんでした。これが私が機能することがわかったものです。
for /F "tokens=*" %%A in (myfile.txt) do [process] %%A
アスタリスク(*)を含むtokensキーワードは、行全体のすべてのテキストを引き出します。アスタリスクを入力しない場合は、行の最初の単語のみが取得されます。スペースに関係していると思います。
すべての投稿に感謝します!
ファイルパスにスペースがある場合は、を使用する必要がありますusebackq
。例えば。
for /F "usebackq tokens=*" %%A in ("my file.txt") do [process] %%A
for /F "tokens=*" %%A in ("myfile.txt") do echo A = %%A
- > A = myfile.txt
これを阻止するためにどのように任意のアイデア?
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を参照して残りのすべてのトークンを取得します。
指定するファイル名にスペースが含まれている場合は、テキストを引用符で囲みます(たとえば、「ファイル名」)。引用符を使用するには、usebackqを使用する必要があります。それ以外の場合、引用符は解析するリテラル文字列を定義するものとして解釈されます。
ちなみに、ほとんどのWindowsシステムのコマンドラインヘルプファイルは次の場所にあります。
"C:\WINDOWS\Help\ntcmds.chm"
バッチファイルでは、しなければならない使用%%
の代わりに%
:(タイプ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"は、myfile.txtからforコマンドで取得した情報を "process" 'subroutine'に渡します。
バッチプログラムでforコマンドを使用している場合は、変数に二重の%記号を使用する必要があります。
次の行は、これらの変数をforコマンドからプロセスの「サブルーチン」に渡し、この情報を処理できるようにします。
set VAR1=%1
set VAR2=%2
set VAR3=%3
この正確な設定のかなり高度な使用法がいくつかあります。さらに例が必要な場合は、喜んで共有します。もちろん、必要に応じてEOLまたはDelimsを追加します。
最初の "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---
@MrKrausの答えは有益です。さらに、バッチファイルと同じディレクトリにあるファイルをロードする場合は、ファイル名の前に%〜dp0を付けます。次に例を示します。
cd /d %~dp0
for /F "tokens=*" %%A in (myfile.txt) do [process] %%A
注:ファイル名またはディレクトリ(上記の例のmyfile.txtなど)にスペース(たとえば、 'my file.txt'または 'c:\ Program Files')がある場合は、次を使用します。
for /F "tokens=*" %%A in ('type "my file.txt"') do [process] %%A
、typeキーワードを使用してtype
プログラムを呼び出し、テキストファイルの内容を表示します。typeコマンドを呼び出すことによるオーバーヘッドを望まない場合は、ディレクトリをテキストファイルのディレクトリに変更する必要があります。スペースを含むファイル名の場合もtypeが必要であることに注意してください。
これが誰かを助けることを願っています!
**cd /d %~dp0**
、forループの前に呼び出されます。これにより、バッチファイルが置かれているディレクトリ内のファイルを参照していることを確認できます。観察をありがとう
type
walkaround
type
スペースが含まれている別のディレクトリにあるため、ファイル名を引用符で囲まなければなりませんでした(くそーProgram Files
)。エラーが発生するThe system cannot find the file `type.
受け入れられた答えは良いですが、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は、各行の先頭に行番号とコロンを付けるために使用されるため、空の行はもはや空ではありません。
%%a
パラメータにアクセスするとき、DelayedExpansionを無効にする必要があります。無効にすると、感嘆符!
とキャレット^
はそのモードで特別な意味を持つため失われます。
ただし、行から行番号を削除するには、遅延拡張を有効にする必要があります。
set "var=!var:*:=!"
最初のコロンまでをすべて削除します(delims=:
findstrからのものだけでなく、行の先頭にあるすべてのコロンも削除します)。
endlocalは、次の行の遅延拡張を再び無効にします。
唯一の制限は行の長さの制限である〜8191ですが、これを克服する方法はないようです。
setlocal
コマンドラインで許可していません。CMDでコードを実行すると、!var!ブランクの代わりに。直し方?
これは、フォルダー内のすべてのSQLスクリプトを実行するために私が書いたbatファイルです。
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
NTファミリのWindows(cmd.exe
シェルとして1つ)を使用している場合は、FOR / Fコマンドを試してください。
cmd.exe
とを使用して承認されたanwser
for /F "tokens=*" %F in (file.txt) do whatever "%F" ...
「通常の」ファイルに対してのみ機能します。それは巨大なファイルで惨めに失敗します。
大きなファイルの場合、Powershellと次のようなものを使用する必要がある場合があります。
[IO.File]::ReadLines("file.txt") | ForEach-Object { whatever "$_" }
または、十分なメモリがある場合:
foreach($line in [System.IO.File]::ReadLines("file.txt")) { whatever "$line" }
これは、200万行を超える250 MBのファイルで機能for /F ...
し、数千行後にコマンドがスタックしました。
間の違いのためにforeach
とForEach-Object
、参照ノウのForEachとのForEach-Objectにへの行き方。
(クレジット:PowerShellで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
完全なコードはこちら。
for /f "tokens=1" %%i in ('find /v "=" heroku_apps.txt ^| find /v ".TXT" ^| findstr /r /v /c:"^$"') do...
(^
パイプをエスケープするために使用されるの追加に注意してください。これによりfor
、コマンドプロセッサにではなく直接渡されます)
コマンドラインからテキストファイルのすべての行を出力するには(delayedExpansionを使用):
set input="path/to/file.txt"
for /f "tokens=* delims=[" %i in ('type "%input%" ^| find /v /n ""') do (
set a=%i
set a=!a:*]=]!
echo:!a:~1!)
先頭の空白、空白行、空白行で動作します。
Win 10 CMDでテスト済み
]]]
ラインから、第二のサンプルは、スペースで始まる空行と行をドロップ
delims
、テキストファイルのいずれかの行が、]
たとえば、ない文字、またはバックスペースやベルなどの制御文字に置き換えます。それらは通常テキストファイルにはありません。その理由delims=]
は、/n
of find
コマンドで作成されたプレースホルダーを削除して空白行を保持するためです。
%%A
と%A
上記のコマンドインチ そうでなければあなたは得るでしょう%%A was unexpected at this time.
。