405

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

また、特定のエントリがディレクトリなのか、単なるファイルなのかをどのように見分けることができますか?

4

17 に答える 17

560

これにより、現在のディレクトリ内のすべてのファイル(およびファイルのみ)が一覧表示されます。

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

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

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

(@agnulに感謝)

于 2008-09-26T09:56:07.017 に答える
237

反復処理...

  • ...現在のディレクトリのファイル: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

于 2008-09-26T10:05:56.290 に答える
66

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

コマンドラインから:

FOR %i IN (*) DO ECHO %i

バッチ ファイルから:

FOR %%i IN (*) DO ECHO %%i
于 2008-09-26T11:52:44.870 に答える
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」システム属性を持つエントリが表示されます。

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

お役に立てれば。

于 2009-07-07T13:02:22.050 に答える
14

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

これを試して:

@echo off
for %%i in (*.*) do echo %%i
于 2008-09-26T09:52:34.217 に答える
5
for %1 in (*.*) do echo %1

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

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

于 2008-09-26T09:48:12.433 に答える
3

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

dir /b /a-d > AllFilesInCurrentDirectorylist.txt
于 2010-09-28T09:21:02.290 に答える
3

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

forfiles /s 

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

forfiles /p c:\ /s /m *.* /c "cmd /c if @isdir==true echo @file is a directory"
于 2014-09-11T14:41:35.343 に答える
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を確認してください。

于 2008-09-26T09:56:26.670 に答える
2

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

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

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

于 2012-12-29T19:27:55.680 に答える
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 のメッセージ「ファイルが見つかりません」に対してテストできます。 "。

于 2011-01-04T17:55:15.570 に答える