2016-11-19 68 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"

相關問題