「for」ループを使用して、ディレクトリ内のすべてのファイルを反復する


352

forループを使用してディレクトリ内の各ファイルを反復するにはどうすればよいですか?

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


1
デフォルトのWindowsシェルを意味すると想定して、投稿のタグを付け直して少しわかりやすくしました
David Schmitt

2
使用しているWindowsのバージョンも指定してください。
2008

1
これらは互いに独立しているため、2つの別個の質問に分割する必要があります。
julealgon

回答:


492

これは、現在のディレクトリ内のすべてのファイル(およびファイルのみ)をリストします。

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

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

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

(@agnulに感謝)


73
これを再帰的に使用したくない場合は、/ rを
削除してください

28
現在のディレクトリに(再帰的に)ファイル名のみ(フルパスではなく)の拡張子をエコーする場合は、次のように実行できますfor /r %i in (*) do ( echo %~nxi )。このスレッドも非常に役立ちます:stackoverflow.com/questions/112055/…
Sk8erPeter

2
@Vaccanoはい、Doの後にかっこを使用します。つまり、(エコー%i&del%i)。複数のコマンドに対して、「&」の代わりに「Enter」を使用することもできます。
ジェイ

2
エコーではなくコピー/移動などのコマンドを使用している場合は、パスを適切に引用符で囲んでください。/ r %% i in(*)do echo "%% i"
Soundararajan

2
明らかに、1文字の変数名を使用する必要があります。
アルバロ・ゴンサレス

214

繰り返す...

  • ...現在のディレクトリ内のファイル: 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/en-us/library/bb490890.aspx


21
%fileそして、%subdirだけ長い1つの文字、つまりすることができ%f%s
Felix Dombek 2013

1
「現在のディレクトリのサブディレクトリ」が機能していません。エラーが表示されます:現時点ではsは予期されてい
ませんでし

78

各ファイルを反復処理するには、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はファイルの最初の行のみを取得します。


18
ああ、複数行の例。それをありがとう!
Nyerguds

@Aaron Votreループを終了するには?
nijogeorgep

@nijogeorgepループを「終了」する必要はありません。私の例では、括弧内のすべて(echoなど)が、ディレクトリ内の各「* .txt」ファイルに対して1回実行されます。:私は、あなたが探している答えは、より良いここで説明するかもしれないと思うstackoverflow.com/questions/1355791/...
アーロンVotre

@Aaron Votreスクリプトを使用していくつかのmavenコマンドを実行しようとしましたが、無限ループとして実行されていたため、それを要求しました。今すぐ購入し、ループに出口を追加して問題を修正しました
nijogeorgep

@nijogeorgepわかりました!
Aaron Votre 2016年

57

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

コマンドラインから:

FOR %i IN (*) DO ECHO %i

バッチファイルから:

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

44

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

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

"delims ="は、スペースを含む長いファイル名を表示するのに役立ちます...。

'/ b "は名前のみを表示し、日付などは表示しません。

dirの/ a引数について知っておくべきこと。

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

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

お役に立てれば。


10

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

これを試して:

@echo off
for %%i in (*.*) do echo %%i

あなたが正しい。私はイミディエイトモードでFOR構文をチェックし、パラメータを忘れてその行を回答に直接貼り付けました:-)
Axeman

5
for %1 in (*.*) do echo %1

完全なガイドについては、cmdで「HELP FOR」を試してください

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


4

使用できるすべてのファイルとフォルダー反復処理するには

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

4

この参照が見つかるまで、絶対パスで作業するためにジョップの答えを取得するのに問題がありました:https ://ss64.com/nt/for_r.html

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

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

3

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

dir /b /a-d > AllFilesInCurrentDirectorylist.txt

3

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

forfiles /s 

また、それがディレクトリであるかどうかを確認します

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

@isdir==trueする必要があります@isdir==TRUE
psyklopz 2015

2

私は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を確認してください。


私はこれを行うためにperlを使用したでしょう。残念ながら、それは私次第ではありません。
Vhaerun 2008

古いアプリケーション?悲しいこと。
Biri、

ばかげた開発者はバッチファイルを見て、それが私たちのすべての問題の治療法であると考えました。
Vhaerun 2008

1
@Vhaerun Perlに対するWindows Script Host(WSH)の利点の1つは、WSHがすべてのバージョンのWindowsにプリインストールされているのに対して、Perlは個別にインストールする必要があることです。
Parampreet Dhatt 2013年

2

/ Lオプションを指定したxcopyコマンドを使用して、ファイル名を取得します。したがって、ディレクトリまたはサブディレクトリ内のすべてのファイルを取得したい場合は、次のようにします。

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

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


2

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

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のメッセージ「ファイルが見つかりません「。


2

これを試して:

::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 ..)を追加するだけです


1

私の場合、tempフォルダーの下にあるすべてのファイルとフォルダーを削除する必要がありました。これが私が最終的にやった方法です。ファイル用とフォルダー用の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

これが、コード内のコメントです。

私はbiatchスキルでブラッシュアップしているだけなので、露骨なエラーは許します。

ユーザーがそれを必要とする箇所に少し変更を加えることで、できる限りオールインワンのソリューションを記述しようとしました。

いくつかの重要な注意:変数recursiveFALSEルートディレクトリのファイルとフォルダーのみを処理場合。それ以外の場合は、すべてのフォルダとファイルを通過します。

C&C大歓迎...

@echo off
title %~nx0
chcp 65001 >NUL
set "dir=c:\users\%username%\desktop"
::
:: Recursive Loop routine - First Written by Ste on - 2020.01.24 - Rev 1
::
setlocal EnableDelayedExpansion
rem THIS IS A RECURSIVE SOLUTION [ALBEIT IF YOU CHANGE THE RECURSIVE TO FALSE, NO]
rem By removing the /s switch from the first loop if you want to loop through
rem the base folder only.
set recursive=TRUE
if %recursive% equ TRUE ( set recursive=/s ) else ( set recursive= )
endlocal & set recursive=%recursive%
cd /d %dir%
echo Directory %cd%
for %%F in ("*") do (echo    → %%F)                                 %= Loop through the current directory. =%
for /f "delims==" %%D in ('dir "%dir%" /ad /b %recursive%') do (    %= Loop through the sub-directories only if the recursive variable is TRUE. =%
  echo Directory %%D
  echo %recursive% | find "/s" >NUL 2>NUL && (
    pushd %%D
    cd /d %%D
    for /f "delims==" %%F in ('dir "*" /b') do (                      %= Then loop through each pushd' folder and work on the files and folders =%
      echo %%~aF | find /v "d" >NUL 2>NUL && (                        %= This will weed out the directories by checking their attributes for the lack of 'd' with the /v switch therefore you can now work on the files only. =%
      rem You can do stuff to your files here.
      rem Below are some examples of the info you can get by expanding the %%F variable.
      rem Uncomment one at a time to see the results.
      echo    → %%~F           &rem expands %%F removing any surrounding quotes (")
      rem echo    → %%~dF          &rem expands %%F to a drive letter only
      rem echo    → %%~fF          &rem expands %%F to a fully qualified path name
      rem echo    → %%~pF          &rem expands %%A to a path only
      rem echo    → %%~nF          &rem expands %%F to a file name only
      rem echo    → %%~xF          &rem expands %%F to a file extension only
      rem echo    → %%~sF          &rem expanded path contains short names only
      rem echo    → %%~aF          &rem expands %%F to file attributes of file
      rem echo    → %%~tF          &rem expands %%F to date/time of file
      rem echo    → %%~zF          &rem expands %%F to size of file
      rem echo    → %%~dpF         &rem expands %%F to a drive letter and path only
      rem echo    → %%~nxF         &rem expands %%F to a file name and extension only
      rem echo    → %%~fsF         &rem expands %%F to a full path name with short names only
      rem echo    → %%~dp$dir:F    &rem searches the directories listed in the 'dir' environment variable and expands %%F to the fully qualified name of the first one found. If the environment variable name is not defined or the file is not found by the search, then this modifier expands to the empty string
      rem echo    → %%~ftzaF       &rem expands %%F to a DIR like output line
      )
      )
    popd
    )
  )
echo/ & pause & cls
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.