サブディレクトリ内のファイルをカウントするバッチファイルが必要です。このカウントをテキスト ファイルに保存します。
ここに私が正確に欲しいものの概要があります:
1 つのフォルダーには多数のフォルダーが含まれているため、すべてのサブフォルダーのファイル数をテキスト ファイルにする必要があります。
O/p は次のようになります。
フォルダ1: 23
フォルダ2: 34
フォルダ3: 12
あなたは私の主張を理解したと思います。私を助けてください。
サブディレクトリ内のファイルをカウントするバッチファイルが必要です。このカウントをテキスト ファイルに保存します。
ここに私が正確に欲しいものの概要があります:
1 つのフォルダーには多数のフォルダーが含まれているため、すべてのサブフォルダーのファイル数をテキスト ファイルにする必要があります。
O/p は次のようになります。
フォルダ1: 23
フォルダ2: 34
フォルダ3: 12
あなたは私の主張を理解したと思います。私を助けてください。
ここでは、少し異なる方法を示します。
以下のスクリプトは、指定されたディレクトリのサブディレクトリを繰り返し処理し、DIR /A-D
それぞれを呼び出し、 の出力の概要からファイル数を抽出してDIR
、サブディレクトリの名前とともに表示します。
@ECHO OFF
SET "rootpath=%~1"
FOR /D %%D IN ("%rootpath%\*") DO (
FOR /F %%K IN ('DIR /A-D "%%D" 2^>NUL ^| FIND "File(s)" ^|^| ECHO 0') DO (
ECHO %%D: %%K
)
)
親ディレクトリへのパスは、コマンド ラインから取得する必要があります。
スクリプトは、サブディレクトリに直接配置されたファイルのみをカウントします。ただし、必要に応じて、サブディレクトリ ツリーに格納されているすべてのファイルの数を返すように簡単に拡張できます。1 つの方法を次に示します。
@ECHO OFF
SET "rootpath=%~1"
FOR /D %%D IN ("%rootpath%\*") DO (
SET cnt=0
FOR /F %%K IN ('DIR /A-D /S "%%D" 2^>NUL ^| FIND "File(s)" ^|^| ECHO 0') DO (
SET /A cnt+=%%K
)
SETLOCAL EnableDelayedExpansion
ECHO %%D: !cnt!
ENDLOCAL
)
DIR
修正されたバージョンは、出力に複数の要約が含まれることを除いて、元のバージョンとほぼ同じように機能します。スクリプトは、すべての要約からファイル数を抽出し、すべての数を合計して、ディレクトリ ツリー内の合計ファイル数を取得します。この場合、結果を表示するときに遅延展開を有効にする必要があります。これは、合計カウントが環境変数 ( cnt
) に格納されているためです。このような場合、「通常の」(即時) 展開を使用すると、環境変数が正しく評価されません。
もう 1 つの注意点は、サブディレクトリ名を表示するときに、両方のバージョンの表示にパスが含まれていることです。名前だけが必要な場合は(他の回答へのコメントの1つに基づいて行うようです)、ECHO %%~nxD: ...
代わりにECHO %%D: ...
.
編集
これを作り直しました。この例では、2 つのバッチ ファイルを使用しています。test.cmd
とfilecount.cmd
test.cmd
ディレクトリのみを反復filecount.cmd
し、それぞれを呼び出します。
ファイルを明示的に実行するだけで、ファイルをカウントするためtest.cmd
に呼び出さfilecount.cmd
れ、次のような出力が生成されます。これは、先ほどの短いテストからの実際の出力です。メイン ディレクトリ内のファイルの数が必要ない場合は、最初のバッチ ファイルからその行を省略します。
.: 7
folder1: 3
folder2: 2
folder3: 5
この例では、ファイルをカウントしているディレクトリと同じディレクトリにバッチ ファイルがあることを前提としています。
test.cmd:
@echo off
setlocal
call filecount .
for /f %%f in ( 'dir /AD /b' ) do (
call filecount %%f
)
:EOF
endlocal
ファイル数.cmd:
@echo off
setlocal enabledelayedexpansion
set /a i=0
for /f %%f in ( 'dir /b /A-D %1' ) do (
set /a i=i+1
@rem echo %%f !i!
)
echo %1: %i%
:EOF
endlocal
filecount.cmd
画面にエコーするだけなので、必要に応じてその出力をファイルにリダイレクトできます。
これは大雑把な例であり、ディレクトリ構造をそのまま再帰的にクロールすることはできませんが、それを達成するために少し手を加えることはできるかもしれません。元の(編集前の)回答で述べたように、ある時点で、バッチ言語では(おそらく)十分なパワーが得られず、vbscript や javascript などを調べる必要があります。