2016-05-16 2 views
0

バッチスクリプトを使用してフォルダ内のすべてのファイルを反復処理するスクリプトを作成しています。私が使用していますコマンドは、これだけで正常に動作しますバッチスクリプトのループパラメータ名の場合

for /r F:\foo\ %%i in (bar_*.txt) do echo %%i

です。しかし、%%i%%filesに置き換えた場合、%files was unexpected at this timeというエラーが表示されます。 documentation pageには、1文字しか使用できないと記載されています。これの背後にある理由は何ですか?変数に意味のある名前を付ける方法はありますか?

+2

1文字変数:forの理由はそのようにプログラムされています。より意味のある名前:いいえ、でもコピーを使うことができます: 'set files = %% i'。それを使用するには、[遅延拡張](http://stackoverflow.com/a/30284028/2152082)が必要です:理由の[echo!file!] – Stephan

+1

は[連続するトークン](http:// ss64。 com/nt/for_f.html) 'if for/f'。この場合、コマンドは、トークンで出力を分割し、次の文字にアクセスするために、アルファベットの次の文字を使用する必要があります。単語ではできません。 – npocmaka

+0

@Stephanあなたの答えとリンクは私が持っていた複数の問題を解決しました。遅れた展開についての答えは有用で分かりやすい – mahacoder

答えて

0

ループ変数は、任意の名前のループ変数では実現できないtokens=1,4,6-9機能のため、単一文字変数でなければなりません。

たとえば、CSVファイルinput.csv) the first data column, the fourth data column and the data columns six to nine should be written into CSV file output.csv`からです。

@echo off 
if not exist "input.csv" exit /B 
if exist "output.csv" del "output.csv" 
for /F "usebackq tokens=1,4,6-9 delims=," %%A in ("input.csv") do (
    echo %%A,%%B,%%C,%%D,%%E,%%F>>"output.csv" 
) 

ループ変数は任意の名前を持つことができる場合は、Windowsのコマンドプロセッサは、ループ変数と環境変数を参照を区別するためにも、それは非常に困難であろう。

ループ変数の値を環境変数に割り当てることはできますが、ループ内の他のコマンドラインでは遅延拡張を使用して環境変数を使用できます。

@echo off 
setlocal EnableDelayedExpansion 
for /R F:\foo\ %%# in (bar_*.txt) do (
    set "FileName=%%#" 
    echo Current file is: !FileName! 
) 
endlocal 

注:これは、各データ行に空のフィールド値がない場合にのみ機能します。

環境変数では大文字と小文字は区別されませんが、ループ変数では大文字と小文字が区別されます。 %~nI,%~nxIなどを使用するときは、ループ変数に小文字を使用しないでください。これと同様の問題が発生する可能性があります。ところで

:なぜ再帰的にワイルドカードパターンbar_*.txtに一致するすべてのファイルをコピーするオプション/SまたはXCOPYまたはROBOCOPYCOPYを使用していませんか?

関連する問題