17

現在、次のコマンドを使用していくつかのディレクトリを一覧表示しています。

dir /b /s /AD > c:\temp\dir_list.txt

これは私が必要とするほとんどのリストを私に与えます。ただし、一部のフォルダーには非常に多くのサブフォルダーがあり、リストに表示したくないため、データが多すぎます。

コマンドの再帰の深さを-たとえば-3に制限することは可能ですか?

c:\dir_1\dir_2\dir_3\dir_foo

したがって、上記の例のコマンドをc:>で実行すると、dir_fooディレクトリは表示されませんが、dir_nディレクトリのみが表示されます...

たぶんバッチ/vbスクリプトなしで?

4

4 に答える 4

20

nレベルのディレクトリを一覧表示する複雑なコマンドを作成できると確信しています。しかし、構文とエラーが発生しやすいことを覚えておくのは難しいでしょう。また、レベル数を変更するたびに変更する必要があります。

単純なスクリプトを使用する方がはるかに優れています。

5年後の編集 -実際、Vista以降に利用できるシンプルなワンライナーがあります。私の新しいROBOCOPYソリューションをご覧ください。

これは、深さ優先探索を実行するバッチソリューションです。DIR / Sコマンドは幅優先探索を実行しますが、私はこの深さ優先形式を好みます。

@echo off
setlocal
set currentLevel=0
set maxLevel=%2
if not defined maxLevel set maxLevel=1

:procFolder
pushd %1 2>nul || exit /b
if %currentLevel% lss %maxLevel% (
  for /d %%F in (*) do (
    echo %%~fF
    set /a currentLevel+=1
    call :procFolder "%%F"
    set /a currentLevel-=1
  )
)
popd

幅優先バージョンは、追加のFORループが必要なことを除いて、ほぼ同じです。

@echo off
setlocal
set currentLevel=0
set maxLevel=%2
if not defined maxLevel set maxLevel=1

:procFolder
pushd %1 2>nul || exit /b
if %currentLevel% lss %maxLevel% (
  for /d %%F in (*) do echo %%~fF
  for /d %%F in (*) do (
    set /a currentLevel+=1
    call :procFolder "%%F"
    set /a currentLevel-=1
  )
)
popd

どちらのスクリプトも2つの引数を想定しています。

arg1=リストされるルートディレクトリのパス

arg2=リストするレベルの数。

したがって、現在のディレクトリの3つのレベルを一覧表示するには、次を使用できます。

listDirs.bat . 3

別のディレクトリの5つのレベルを一覧表示するには、次を使用できます。

listDirs.bat "d:\my folder\" 5
于 2012-09-18T16:15:35.510 に答える
19

結局のところ(5年)、私は今、ずっと利用可能であった1つのライナーを単純なコマンドラインで見つけました。ROBOCOPYVista以降の標準のWindowsユーティリティであり、Windowsリソースキットを介してXPで利用できます。

robocopy . . /l /s /njh /njs /ns /lev:4 >c:\temp\dir_list.txt

説明

    /L :: List only - don't copy, timestamp or delete any files.
    /S :: copy Subdirectories, but not empty ones.
  /NJH :: No Job Header.
  /NJS :: No Job Summary.
   /NS :: No Size - don't log file sizes.
/LEV:n :: only copy the top n LEVels of the source directory tree.

オプションにはカウントにルートが含まれ、/lev:n3つのサブディレクトリレベルが必要です。そのため、値に1を追加しました。

さらに処理する

ルートフォルダが出力に含まれ、各パスに固定幅の先頭の空白が含まれているという点で、出力は完全ではありません。ルートパスと先頭の空白を。で簡単に削除できますFOR /F

(for /f "skip=2 tokens=*" %A in ('robocopy . . /l /s /njh /njs /ns /lev:4') do @echo %A) >c:\temp\dir_list.txt

出力には最初のROBOCOPY空白行が含まれているため、skip1ではなく2にする必要があります。

各パスはで終わり\ます。ファイルではなくフォルダを一覧表示していることが明らかになるので、この機能が気に入っています。末尾を本当に削除したい場合は\、を追加できますFOR

(for /f "skip=2 tokens=*" %A in ('robocopy . . /l /s /njh /njs /ns /lev:4') do @for %B in ("%A.") do @echo %~fB) >c:\temp\dir_list.txt

しかし、コマンドを入力するのは少し手に負えなくなりつつあります。ルートパスとレベルを引数として取るユーティリティバッチファイルに、この手法を簡単に組み込むことができます。コマンドをバッチスクリプト内に配置する場合は、パーセントを2倍にすることを忘れないでください。

于 2017-03-02T15:52:38.717 に答える
5

これは、@ dbenhamの深さ優先探索ソリューションに基づいており、最小レベル
も 設定できるソリューションです。

@echo off
setlocal
set currentLevel=0
set maxLevel=%2
if not defined maxLevel set maxLevel=1
set minLevel=%3
if not defined minLevel set minLevel=0

:procFolder
pushd %1 2>nul || exit /b
if %currentLevel% lss %maxLevel% (
  for /d %%F in (*) do (
    if %currentLevel% geq %minLevel% echo %%~FF
    set /a currentLevel+=1
    call :procFolder "%%F"
    set /a currentLevel-=1
  )
)
popd

最小レベルを設定するには、3番目のパラメーターとして指定するだけです。
例:レベル2からレベル5までリストするには、次のように使用できます。

listDirs.bat target_path 5 2

または、このパラメーターを空のままにして、基本レベルからリストすることもできます。

listDirs.bat target_path 5
于 2014-01-15T13:03:26.890 に答える
2

これは、dbenham(およびelady)のソリューションを少し拡張したものです。深さに応じて出力をインデントします。 読みやすさが大幅に向上します。

@echo off
setlocal
set currentLevel=0
set maxLevel=%2
if not defined maxLevel set maxLevel=1
set minLevel=%3
if not defined minLevel set minLevel=0

:procFolder
pushd %1 2>nul || exit /b
set "indent=."
if %currentLevel% lss %maxLevel% (
  for /d %%F in (*) do (
    for /l %%i in (1,1,%currentLevel%) do echo|set /p=%indent%
    if %currentLevel% geq %minLevel% echo %%~fF
    set /a currentLevel+=1
    call :procFolder "%%F"
    set /a currentLevel-=1
  )
)
popd

インデント文字をで設定できますset "indent ...

于 2015-05-03T10:54:50.430 に答える