2015-08-31 3 views
0

Команда forfiles обеспечивает возможность ходить по дереву каталогов рекурсивно, каждая итерация возвращает путь относительно данного корневого каталога при использовании его переменной @relpath (каждый элемент с префиксом .\, и, к сожалению, в двойных кавычках):Как пройти через дерево каталогов, возвращающее относительные пути без использования `forfiles`?

forfiles /S /P "D:\data" /S /M "*" /C "cmd /C echo @relpath" 

Есть ли способ сделать именно это без forfiles (но без окружающих котировок предпочтительнее)?
На самом деле я хочу избежать какой-либо самокодируемой сборки или перестроить относительный путь, если это возможно.


Следующие строки и обеспечивают абсолютные пути только (даже добавление \ или \. к корневому пути или предваряя маску с .\ ничего не меняет):

for /R "D:\Data" %L in ("*.*") do echo %L 
cd /D "D:\Data" & for /R "." %L in ("*.*") do echo %L 

разборе Также выход dir /S /B "D:\Data" с разрешением for /F не делает то, что я хочу, потому что dir возвращает абсолютные пути, как только переключается переключатель /S.

+0

Это специфично для Windows/партии? – kjprice

+0

Да, это связано с Windows (я добавлю тег); это не обязательно связано с пакетом, так как вы можете выполнять все команды непосредственно в интерпретаторе командной строки (это то, что я сделал, см. синтаксис 'for''% L', который должен читать '%% L', если он используется в пакете); – aschipfl

ответ

1

Вы можете попробовать с

xcopy /l /s . "%temp%" | find ".\" 

И нет, ничего не копируется, мы просто запросить список файлов для копирования (выключатель /l).

Команда find включена только для удаления нижнего колонтитула с количеством совпадающих файлов.

+0

Отличная идея с использованием 'xcopy', @MCND! Дополнительным преимуществом для меня является то, что возвращается список чистых файлов без каталогов. – aschipfl

0

на основе @ MCND-х answer, я обеспечиваю полный код, который я собираюсь использовать (запускается из корневой директории):

for /F "tokens=2 delims=:" %L in ('xcopy /L /S /E /I /Y /C "*.*" "%TEMP%"') do echo %L 

Выход представляет собой список чистых путей файлов относительно текущего каталога.

Поскольку источником является файл шаблона *.* вместо текущего каталога . здесь, каждый в списке относительный путь к файлу с префиксом текущего диска (например, D:, не более .\). Вот почему я использую опцию for /Fdelims=:. В каждой оставшейся строке не будет никаких других двоеточие (ы), поэтому использование tokens=2 безопасно. Это приложение for /F отфильтровывает итоговую строку xcopy, поэтому дополнительных find не требуется. Каждая строка начинается с буквы диска, поэтому опция eol=; по умолчанию не имеет значения.

Чтобы использовать это в пакетном файле, обменивайтесь %L на %%L.