我正在尝试将批处理文件输出到文件夹和子文件夹的短名称。但是,通过下面的示例,我只能获得完整路径。
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批处理文件,将当前目录中的文件夹和子文件夹列表输出到文本文件中?
答案 0 :(得分:2)
@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
命名为屏幕即可。您知道如何重定向。
答案 1 :(得分: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
命令之前,很容易添加一些代码来检查未使用的驱动器号。
答案 2 :(得分:1)
确认我对重复回复的评论:
@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
答案 3 :(得分:1)
仅使用递归函数调用方法包含解决方案
@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"
。