2013-10-23 7 views
12

ディレクトリ内のすべてのファイル名を取得し、コマンドラインから変数に格納する必要があります。ディレクトリ内のファイル名のリストを取得し、cmdコマンドを使用して変数に格納する方法

私はこの

`dir /s /b > print.txt` 

に出くわしたが、これはtxtファイルにファイル名を出力します。

これらの名前はどのように変数に格納できますか?

+0

「FOR」を使用して変数に入れます。コマンドラインから/ f%a( 'dir/s/b')do(echo%a)を実行するか、バッチファイル内の%%を二倍にします。 –

+1

[バッチファイル - ファイルのリストを変数に書き込む]の可能な複製(https://stackoverflow.com/questions/3238433/batch-file-write-list-of-files-to-variable) –

答えて

21

私はあなたが本当に、Windowsのバッチファイルではなく、DOSを意味すると仮定しています。

バッチ環境変数は8191文字に制限されているため、ファイル数と平均ファイルパス長に応じて、すべてのファイルパスを1つの変数に収めることはできません。

ファイル名にスペースが含まれている場合は、引用符で囲む必要があります。

@echo off 
setlocal disableDelayedExpansion 
set "files=" 
for /r %%F in (*) do call set files=%%files%% "%%F" 

CALL文はかなり遅いです:彼らはあなたが使用することができ、一つの変数に収まると仮定すると、

。遅延拡張を使用する方が速いですが、遅延拡張が有効な場合は、%%Fを展開すると!を含む値が破損します。もう少し作業すれば、迅速で安全な遅延拡張バージョンを手に入れることができます。

@echo off 
setlocal disableDelayedExpansion 
set "files=." 
for /r %%F in (*) do (
    setlocal enableDelayedExpansion 
    for /f "delims=" %%A in ("!files!") do (
    endlocal 
    set "files=%%A "%%F" 
) 
) 
(set files=%files:~2%) 

ファイル名が1つの変数に収まらない場合は、ファイルごとに1つの値の擬似配列を使用する必要があります。以下のスクリプトでは、FINDSTRを使用してDIR ouptutの各行に接頭辞を付けます。私は行番号を配列のインデックスとして使用します。

@echo off 
setlocal disableDelayedExpansion 
:: Load the file path "array" 
for /f "tokens=1* delims=:" %%A in ('dir /s /b^|findstr /n "^"') do (
    set "file.%%A=%%B" 
    set "file.count=%%A" 
) 

:: Access the values 
setlocal enableDelayedExpansion 
for /l %%N in (1 1 %file.count%) do echo !file.%%N! 
+0

編集 - うわー!誰も2年間見つけなかった第2の解決策(安全版)の大きなバグを修正しました!私が '!file! 'の代りに' %% A'を代入するまで、安全面は壊れていました。 – dbenham

1
setlocal enableDelayedExpansion 
set /a counter=0 
for /f %%l in ('dir /b /s') do (
set /a counter=counter+1 
set line_!counter!=%%l 
) 
set line_ 

あなたはこの1つの変数のチェックですべてを保存したい場合:@Mattは、バッチファイルを使用して、言ったように Explain how dos-batch newline variable hack works

4

setlocal enabledelayedexpansion 
set params= 
for /f "delims=" %%a in ('dir /s/b') do set params=!params! %%a 
+0

拡張が遅延する'! 'を含むファイル名。 – dbenham

関連する問題