我想创建一个批处理文件。当它被调用为batch.bat MyProject
或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
如何将目录树列表写入文本文件?
必须排除文件名。
答案 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