「for」ループを使用してディレクトリ内のすべてのファイルを反復処理する
-
02-07-2019 - |
質問
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
次のコードは、現在のディレクトリに &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
)