批量脚本循环递归目录,附加初始目录?

时间:2016-10-15 11:08:00

标签: windows batch-file

我有以下批处理脚本

for /D /r %%f in ( %~dp0 ) do echo %%f

根据我的理解,它应该在存储批处理脚本的目录中循环遍历所有目录,并打印完整的文件路径....

但是,如果批处理脚本位于“C:\ my \ path”中,则在其下面有文件夹“a”,“a \ b”和“a \ b \ c”,我得到以下输出

C:\my\path\a\C:\my\path
C:\my\path\a\b\C:\my\path
C:\my\path\a\b\c\C:\my\path

这个脚本有什么问题?

4 个答案:

答案 0 :(得分:1)

您似乎错过了使用for命令:

for /D /r %~dp0 %%F in ( *.* ) do echo %%~F

/R的语法是:

FOR /R [[drive:]path] %%parameter IN (set) DO command 

请参阅http://ss64.com/nt/for.html

答案 1 :(得分:1)

更改命令,以便使用当前目录。

FOR /D /R %%a IN (*) DO ECHO=%%a

更改命令,以便使用脚本目录。

FOR /D /R "%~dp0" %%a IN (*) DO ECHO=%%a

答案 2 :(得分:1)

这是因为如果for中没有通配符(*?),/R不会访问文件系统来解析括号之间的集合,所以字符串是从字面上看。

然而,当然可以访问文件系统来枚举for /R之后给出的目录树。

在切换/R之后提供/D的根路径,并在集合中使用全局通配符。要搜索目录而不是文件,请使用for /D /R "%~dp0" %%F in ("*.*") do echo %%~F 开关:

~

不要忘记在路径项周围加上引号,以避免出现空格和其他特殊字符的问题。 for变量的.修饰符会在循环体中删除它们。

或者,要返回纯目录列表而不进行任何过滤,您可以使用set for /R "%~dp0" %%F in (.) do echo %%~F ,如下所示:

C:\my\path\a\.
C:\my\path\a\b\.
C:\my\path\a\b\c\.

输出可能如下所示:

Info.plist

答案 3 :(得分:-1)

另一个approch将所有文件夹路径存储到一个数组中并显示它们:

@echo off
Title Display recursively all Folders
set "folder=%~dp0"
set "ListFolders=%~dp0ListFolders.txt"
If Exist %ListFolders% Del %ListFolders%
setLocal EnableDelayedExpansion
REM Populate the array with existent sub-folders in this folder
for /f "tokens=* delims= " %%a in ('Dir /b /s /a:d "%folder%"') do (
    set /a N+=1
    set "Folder[!N!]=%%a"
)
::*****************************************************************
:Display_Folders
cls & color 0E
echo Just showing only Folders :
echo(
For /L %%i in (1,1,%N%) do (
    echo Folder[%%i] = !Folder[%%i]!
    echo !Folder[%%i]! >> %ListFolders%
)
echo(
echo Hit any key to show the LogFile in "%ListFolders%"
pause>nul
Start "" %ListFolders%