ループ変数は、任意の名前のループ変数では実現できない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またはROBOCOPYでCOPYを使用していませんか?
1文字変数:forの理由はそのようにプログラムされています。より意味のある名前:いいえ、でもコピーを使うことができます: 'set files = %% i'。それを使用するには、[遅延拡張](http://stackoverflow.com/a/30284028/2152082)が必要です:理由の[echo!file!] – Stephan
は[連続するトークン](http:// ss64。 com/nt/for_f.html) 'if for/f'。この場合、コマンドは、トークンで出力を分割し、次の文字にアクセスするために、アルファベットの次の文字を使用する必要があります。単語ではできません。 – npocmaka
@Stephanあなたの答えとリンクは私が持っていた複数の問題を解決しました。遅れた展開についての答えは有用で分かりやすい – mahacoder