我有以下批处理脚本
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
这个脚本有什么问题?
答案 0 :(得分:1)
您似乎错过了使用for命令:
for /D /r %~dp0 %%F in ( *.* ) do echo %%~F
/R
的语法是:
FOR /R [[drive:]path] %%parameter IN (set) DO command
答案 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%