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

StackOverflow https://stackoverflow.com/questions/138497

質問

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

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

役に立ちましたか?

解決

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

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

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

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

(@ agnulに感謝)

他のヒント

繰り返し...

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

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

コマンドラインから:

FOR %i IN (*) DO ECHO %i

バッチファイルから:

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

各ファイルを反復処理するには、forループが機能します。

(ディレクトリ\パス\ *)の%% fの

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&lt; = %% fはファイルの最初の行のみを取得します。

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

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

&quot; delims =&quot;スペースを含む長いファイル名を表示するのに便利です。...

'/ b&quot;サイズの日付などではなく、名前のみを表示します。

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

  • &quot; / a&quot;の使用隠し属性やシステム属性を含むすべてをリストします。
  • &quot; / ad&quot;非表示およびシステムのサブディレクトリを含むサブディレクトリのみを表示します。
  • &quot; / a-d&quot;引数は、 'D'irectory属性を持つコンテンツを削除します。
  • &quot; / a-d-h-s&quot;すべてが表示されますが、「D'irectory」、「H」idden、「S」ystem属性を持つエントリ。

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

これがお役に立てば幸いです。

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

これを試してください:

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

「ヘルプ」を試してください;完全なガイドについてはcmdで

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

次のコードは、現在のディレクトリに &quot; AllFilesInCurrentDirectorylist.txt&quot; という名前のファイルを作成します。このファイルには、現在のディレクトリ内のすべてのファイル(ファイルのみ) 。確認してください

dir /b /a-d > AllFilesInCurrentDirectorylist.txt

forfiles コマンドも使用できます。

forfiles /s 

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

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

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 を確認します。

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

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

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

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

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のメッセージ&quot; File Not見つかった&quot;。

これを試してください:

::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つのループを実行する必要がありました。ファイルまたはフォルダーの名前にスペースが含まれている場合は、&quot;を使用する必要があります。 &quot;

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"
)

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

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

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

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

For /R C:\absoulte\path\ %%G IN (*.*) do (
  Echo %%G
)
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top