web-dev-qa-db-ja.com

Forループを使用して、ディレクトリ内のすべてのファイルを繰り返します。

forループを使用してディレクトリ内の各ファイルを反復処理する方法を教えてください。

あるエントリがディレクトリなのか、それとも単なるファイルなのか、どうすればわかりますか。

301
Vhaerun

現在のディレクトリにあるすべてのファイル(そしてファイルのみ)をリストします。

for /r %i in (*) do echo %i

また、そのコマンドをバッチファイルで実行する場合は、%記号を2倍にする必要があります。

for /r %%i in (*) do echo %%i

(ありがとう@agnul)

428
jop

繰り返します...

  • ...現在のディレクトリにあるファイル:for %f in (.\*) do @echo %f
  • ...現在のディレクトリのサブディレクトリ:for /D %s in (.\*) do @echo %s
  • ...現在およびすべてのサブディレクトリにあるファイル:for /R %f in (.\*) do @echo %f
  • 現在のサブディレクトリとすべてのサブディレクトリの...サブディレクトリ:for /R /D %s in (.\*) do @echo %s

残念ながら、ファイルとサブディレクトリを同時に反復処理する方法は見つかりませんでした。

cygwin を単にbashといっしょに使用すると、はるかに多くの機能が得られます。

これとは別に:あなたは、MS Windowsの組み込みヘルプがcmdのコマンドライン構文の記述のための素晴らしいリソースであることに気付きましたか?

こちらもご覧ください: http://technet.Microsoft.com/ja-jp/library/bb490890.aspx

198
Marco

FORをコマンドラインから実行する場合とバッチファイルから実行する場合には、微妙な違いがあります。バッチファイルでは、各変数参照の前に2つの%文字を配置する必要があります。

コマンドラインから:

FOR %i IN (*) DO ECHO %i

バッチファイルから:

FOR %%i IN (*) DO ECHO %%i
55
aphoria

各ファイルを繰り返し処理するためにforループが機能します。

for %%f in (directory\path\*) do ( something_here )

私の場合、私はファイルの内容、名前なども欲しかった

これはいくつかの問題につながり、私は私のユースケースが役に立つかもしれないと思いました。これはディレクトリ内の各 '.txt'ファイルから情報を読み込み、それを使って何かをできるようにするループです(例えばsetx)。

@ECHO OFF
setlocal enabledelayedexpansion
for %%f in (directory\path\*.txt) do (
  set /p val=<%%f
  echo "fullname: %%f"
  echo "name: %%~nf"
  echo "contents: !val!"
)

*制限:val <= %% fはファイルの最初の行だけを取得します。

47
Aaron Votre

このforループはディレクトリ内のすべてのファイルをリストします。

pushd somedir
for /f "delims=" %%f in ('dir /b /a-d-h-s') do echo %%f
popd

"delims ="は、スペースを含む長いファイル名を表示するのに便利です。

'/ b "は名前だけを表示し、サイズの日付などは表示しません。

Dirの/ a引数について知っておくべきことがいくつかあります。

  • "/ a"を使用すると、隠し属性やシステム属性など、すべてが一覧表示されます。
  • "/ ad"は隠しディレクトリとシステムディレクトリを含むサブディレクトリのみを表示します。
  • "/ a-d"引数は、 'D'ディレクトリ属性を持つコンテンツを削除します。
  • "/ a-d-h-s"はすべてを表示しますが、 'D'ディレクトリ、 'H'隠し 'Sシステム属性を持つエントリです。

コマンドラインでこれを使用する場合は、 "%"を削除してください。

お役に立てれば。

40
Jay

Bashでは、あなたはこのようなことをするかもしれません:

for fn in *; do
    if [ -d $fn ]; then
        echo "$fn is a directory"
    fi
    if [ -f $fn ]; then
        echo "$fn is a file"
    fi
done

私はあなたがbatchについて尋ねたことに気づきました。それを私はbashと誤解しています。したがって、この回答はあなたの質問には適切ではないかもしれません。

11
Greg Hewgill

%1は、渡された最初の引数を参照しています。イテレータでは使用できません。

これを試して:

@echo off
for %%i in (*.*) do echo %%i
10
Sam Meldrum
for %1 in (*.*) do echo %1

フルガイドについてはcmdで "HELP FOR"をお試しください

これはXPコマンドのガイドです。 http://www.ss64.com/nt/

5
Axeman

forfiles コマンドを使用することもできます。

forfiles /s 

そしてそれがディレクトリであるかどうかも確認する

forfiles /p c:\ /s /m *.* /c "cmd /c if @isdir==true echo @file is a directory"
3
Max

次のコードは、現在のディレクトリ内に "AllFilesInCurrentDirectorylist.txt" という名前のファイルを作成します。これには、現在のディレクトリ内のすべてのファイル(ファイルのみ)のリストが含まれます。見てみな

dir /b /a-d > AllFilesInCurrentDirectorylist.txt
3
Ankur

私はvbscript(Windows Scripting Host)を使用します。バッチでは、名前がファイルまたはディレクトリであることがわかりません。

VBSでは、これは次のようになります。

Dim fileSystemObject
Set fileSystemObject = CreateObject("Scripting.FileSystemObject")

Dim mainFolder
Set mainFolder = fileSystemObject.GetFolder(myFolder)

Dim files
Set files = mainFolder.Files

For Each file in files
...
Next

Dim subFolders
Set subFolders = mainFolder.SubFolders

For Each folder in subFolders
...
Next

MSDNで FileSystemObjectを確認してください

2
Biri

Xcopyコマンドに/ Lオプションを付けてファイル名を取得します。それで、もしあなたがディレクトリかサブディレクトリの中のすべてのファイルのどちらかを取得したいなら、あなたはこのような何かをすることができます:

for /f "delims=" %%a IN ('xcopy "D:\*.pdf" c:\ /l') do echo %%a

これはWindowsシステム上に常に存在し、コピーではないので問題ないので、宛先としてc:\を使用するだけです。サブディレクトリが欲しいなら、最後に/ sオプションを使うだけです。他の理由で必要な場合は、他のxcopyスイッチを使用することもできます。

2
Knoots

この参照が見つかるまで、絶対パスで動作するようにjopの答えを取得するのに問題がありました: https://ss64.com/nt/for_r.html

次の例では、絶対パスで指定されたディレクトリ内のすべてのファイルをループします。

For /R C:\absoulte\path\ %%G IN (*.*) do (
  Echo %%G
)
2
datchung

これを試して:

::Example directory
set SetupDir=C:\Users

::Loop in the folder with "/r" to search in recursive folders, %%f being a loop ::variable 
for /r "%SetupDir%" %%f in (*.msi *.exe) do set /a counter+=1

echo there are %counter% files in your folder

それはあなたのディレクトリ(およびサブディレクトリ)内の.msiと.exeファイルを数えます。そのため、実行可能ファイルとしてのフォルダとファイルの違いもあります。

ループ内で他のファイルをフィルタリングする必要がある場合は、拡張子(.pptx .docx ..)を追加するだけです。

2
Littlepony

ファイルがディレクトリかどうかをテストするためにこれを試してください:

FOR /F "delims=" %I IN ('DIR /B /AD "filename" 2^>^&1 ^>NUL') DO IF "%I" == "File Not Found" ECHO Not a directory

これはファイルがディレクトリではないかどうかを教えてくれるだけで、ファイルが存在しない場合にも当てはまります。キャレット(^)はリダイレクト記号をエスケープするために使用され、ファイルリスト出力は表示されないようにNULにリダイレクトされます。一方、DIRリストのエラー出力は出力にリダイレクトされるので、DIRのメッセージ「File Not Found」に対してテストできます。 ".

2
sugerfunk

私の場合、一時フォルダーの下にあるすべてのファイルとフォルダーを削除しなければなりませんでした。だから私はそれをやってしまったのです。ファイル用とフォルダー用の2つのループを実行する必要がありました。ファイルやフォルダの名前にスペースが含まれている場合は、 ""を使用する必要があります

cd %USERPROFILE%\AppData\Local\Temp\
rem files only
for /r %%a in (*) do (
echo deleting file "%%a" ...
if exist "%%a" del /s /q "%%a"
)
rem folders only
for /D %%a in (*) do (
echo deleting folder "%%a" ...
if exist "%%a" rmdir /s /q "%%a"
)
1
Sam B

すべてのファイルとフォルダを反復処理 _にすることができます

for /F "delims=" %%a in ('dir /b /s') do echo %%a

ファイルではなくすべてのフォルダでのみ繰り返すにすると、

for /F "delims=" %%a in ('dir /a:d /b /s') do echo %%a

/sはディレクトリツリー全体のすべての結果を無限の深さで表示します。サブフォルダではなくそのフォルダの内容を反復処理する場合は、/sをスキップできます。

繰り返しで検索を実装する

特定の名前の付いたファイルとフォルダを繰り返す _にすると、名前を検索してforループを使って繰り返すことができます。

for /F "delims=" %%a in ('dir "file or folder name" /b /s') do echo %%a

ファイルではなく特定の名前付きフォルダー/ディレクトリーを反復処理にするには、同じコマンドで/ADを使用します。

for /F "delims=" %%a in ('dir "folder name" /b /AD /s') do echo %%a
1
jafarbtech