如何将目录树列表写入文本文件?

时间:2012-08-07 07:22:19

标签: batch-file

我想创建一个批处理文件。当它被调用为batch.bat MyProjectbatch.bat MyProject/时,它将生成以下列表。请注意,DirMyProject的子目录。我使用的是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

如何将目录树列表写入文本文件?

必须排除文件名。

2 个答案:

答案 0 :(得分:2)

好的 - 这应该这样做。它需要一个参数(根文件夹)。

@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

答案 1 :(得分: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