我试图让批处理文件仅将文件夹和子文件夹的短名称输出到文件中。但是,通过下面的示例,我只能获取完整路径。
DIR /S /B /O:N /A:D > FolderList.txt
将输出:
X:\Example\Folder 1
X:\Example\Folder 2
X:\Example\Folder 3
X:\Example\Folder 1\Sub-Folder 1
X:\Example\Folder 1\Sub-Folder 2
X:\Example\Folder 2\Sub-Folder 1
当所需输出为:
Folder 1
Folder 2
Folder 3
Folder 1\Sub-Folder 1
Folder 1\Sub-Folder 2
Folder 2\Sub-Folder 1
该问题与
/S
开关有关,该开关允许 DIR
命令递归到子文件夹中。
有没有一种简单的方法,仅使用Windows批处理文件,将当前目录中的文件夹和子文件夹列表输出到文本文件?
@ECHO OFF
FOR /f "delims=" %%a IN ('DIR /S /B /O:N /A:D') DO (
SET "name=%%a"
SETLOCAL ENABLEDELAYEDEXPANSION
ECHO(!name:%cd%\=!
endlocal
)
GOTO :EOF
变得更加混乱,因为您要求“短名称”然后描述“相对名称”。
显然,只需将名称
echo
显示到屏幕上即可。您知道如何重定向。
只是为了包含使用递归函数调用方法的解决方案
@echo off
setlocal enableextensions disabledelayedexpansion
call :getSubFolderList "%~1"
goto :eof
:getSubFolderList folder [prefix]
for /d %%a in ("%~f1.\*") do for %%b in ("%~2%%~nxa") do (
echo %%~b
call :getSubFolderList "%%~fa" "%%~b\"
)
goto :eof
当使用起始文件夹调用时,它将迭代子文件夹列表,并且对于每个子文件夹,子例程将调用自身来处理降序文件夹。
这个问题的其他答案使用
echo
来输出文件夹路径,使用delayedexpansion
,回显所使用的变量的内容,不会造成解析器造成的任何问题。但此答案中的代码不使用延迟扩展,文件夹名称中的 &()
等字符可能是 echo
命令中的问题。
为了避免此问题,
echo
的值被引用并包含在 for
可替换参数中。这就是代码中出现 for %%b
的原因。
要生成包含文件夹列表的文件,唯一需要的更改是在第一个
call
命令中:
call :getSubFolderList "%~1" > fileList.txt
注意:答案中的代码已编写为接收要处理的文件夹作为批处理文件的第一个参数。根据您的需要更改
"%~1"
。
这使用了旧的
SUBST
命令的一个小技巧,使根文件夹成为驱动器号。 然后,您可以使用 FOR 命令修饰符从输出变量中删除驱动器号。
@echo off
SET "folders=X:\Example"
subst B: "%folders%"
B:
(FOR /F "delims=" %%G in ('DIR /S /B /O:N /A:D') do echo %%~pnxG)>"%~dp0folderlist.txt
subst B: /D
现在显然这不会在使用之前检查以确保驱动器号 B: 可用。 在执行
SUBST
命令之前添加一些代码来检查未使用的驱动器号很容易。
确认我对重复回复的评论:
@Echo Off
SetLocal EnableDelayedExpansion
For /L %%A In (1 1 8192) Do If "!__CD__:~%%A,1!" NEq "" Set/A "Len=%%A+1"
SetLocal DisableDelayedExpansion
(For /D /R %%A In (*) Do (
Set "AbsPath=%%A"
SetLocal EnableDelayedExpansion
Echo(!AbsPath:~%Len%!
EndLocal))>FolderList.txt
我发现以下命令代码提供了强大的文件夹和子文件夹列表,并使用该列表创建了一个文本文档。 命令提示符 - Get-ChildItem -Path“您的文件路径名”-Recurse |排序对象名称 |输出文件-FilePath“list.txt”
附加信息: 您在 PowerShell 中使用的命令 (dir /s /b /o:gn >list.txt) 应该可以很好地递归列出文件和目录。但是,PowerShell 使用 Get-ChildItem cmdlet 为此目的提供了更强大的命令。 我希望这个回应有帮助。祝你有更好的一天!