2016-11-19 3 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 ed на экран. Вы знаете, как перенаправить.

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, повторяя содержимое переменной, используемой без каких-либо проблем, вызванных синтаксическим анализатором. Но код в этом ответе не использует задержанное расширение, а символы &() в именах папок могут быть проблемой в команде echo.

Чтобы избежать этой проблемы, значение echo цитируется и обертывается внутри заменяемого параметра for. Это и есть причина для кода for %%b.

Чтобы создать файл со списком папок, только изменение необходимо, так это, в первую call команду:

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

Примечание: код в ответе было написано, чтобы получить папку для обработки как первый аргумент для командного файла.Измените "%~1" в соответствии с вашими потребностями.

Смежные вопросы