2016-11-19 67 views
1

我想让一个批处理文件输出文件夹和子文件夹的短名称。但是,在下面的例子中,我只能获得完整路径。Windows批处理文件 - 显示所有文件夹和子文件夹的相对路径

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

重复http://stackoverflow.com/questions/8385454/batch-files-list-all-files-in-a-directory-with-relative-paths – Compo

+0

@Compo这是如何重复?你链接的问题是指**文件**,而我需要一个**文件夹列表**。 – Deadmano

回答

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命令之前,很容易添加一些代码来检查未使用的驱动器号。

+1

你需要在路径上加一个'.'来表示它们是真正相对的,比如'echo。%%〜pnxG' – aschipfl

0

为了证实我的意见是关于重复的响应:

@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 
0
@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编辑屏幕。你知道如何重定向。

0

就包括解决方案使用递归函数调用的方法

@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时,此问题的其他答案使用delayedexpansion,回显使用的变量的内容,而没有任何解析器引起的问题。但是,此答案中的代码不使用延迟扩展,并且文件夹名称中的字符&()可能是echo命令中的问题。

为避免此问题,将值引至echo,并将其封装在for可替换参数中。这就是代码中for %%b的原因。

要生成文件夹列表中,唯一需要的变化是一个文件,在第一call命令:

call :getSubFolderList "%~1" > fileList.txt 

注:在回答代码已经被写入接收的文件夹被处理作为批处理文件的第一个参数。根据您的需求更改"%~1"

相关问题