1

バッチファイルを作成したい。batch.bat MyProjectorとして呼び出されるbatch.bat MyProject/と、次のリストが生成されます。Dirのサブディレクトリであることに注意してくださいMyProject。Windows 7 を使用しています。

Dir
Dir/SubDir1
Dir/SubDir1/SubSubDir1
Dir/SubDir1/SubSubDir2
Dir/SubDir2
Dir/SubDir2/SubSubDir1
Dir/SubDir2/SubSubDir2
Dir/SubDir2/SubSubDir3
Dir/SubDir3
Dir/SubDir4

ディレクトリ ツリーのリストをテキスト ファイルに書き込む方法は?

ファイル名は除外する必要があります。

4

2 に答える 2

2

FORFILES は単純なソリューションを提供しますが、それはSLOWです。このコマンドは、バッチ ファイル内からでもコマンド ラインからでも同じように機能します。

forfiles /s /p "c:\MyProject" /m * /c "cmd /v:on /c if @isdir==TRUE (set f=@relpath&echo !f:~3,-1!)" >listing.txt

MyProject を現在のディレクトリとしてコマンドを実行すると、コマンド
/p "c:\MyProject"からオプションを削除できます。

相対パスが各パスの前に引用符で囲まれていることを気にしない場合.\、解決策はさらに簡単です。

forfiles /s /p "c:\MyProject" /m * /c "cmd /c if @isdir==TRUE echo @relpath" >listing.txt
于 2012-08-07T11:53:10.157 に答える
2

わかりました-これでうまくいくはずです。1 つの引数 (ルート フォルダー) を取ります。

@ECHO OFF

SET root=%1

REM Get the length of the root, to make the path relative later.
REM See http://stackoverflow.com/questions/5837418/how-do-you-get-the-string-length-in-a-batch-file.
ECHO %root%>x&FOR %%? IN (x) DO SET /A rootlength=%%~z? - 1&del x 

for /F "tokens=*" %%G in ('DIR %1 /AD /S /B') do (
    CALL :PrintDirectory "%%G" %rootlength%
)

GOTO :eof

:PrintDirectory 
REM %1 Path to the folder
REM %2 Length of root string.

REM See http://www.dostips.com/DtTipsStringManipulation.php#Snippets.LeftString for
REM information on the string manipulation.

@ECHO OFF
SET start=%2
SET absPath=%1

REM Remove the path root by taking the right-hand side of the string.
CALL SET relPath=%%absPath:~%start%,-1%%

ECHO.%relPath%

結果をバッチファイルにリダイレクトすることで実行できます。

PrintDirectoryStructure.bat c:\MyProject > out.txt
于 2012-08-07T08:21:37.410 に答える