Написать скрипт для рекурсивного вывода списка каталогов и файлов внутри него в пакетном скрипте - PullRequest
2 голосов
/ 29 апреля 2020

Я пытаюсь написать пакетный скрипт, который рекурсивно перечисляет все каталоги и их файлы с типом *.js в следующем формате:

Например, если я начинаю с C:\project каталог

c:\project
project.js
project_time.js

c:\project\core
core.js
core_render.js
core_application.js

Я пытался реализовать вышеупомянутые логи c в коде следующим образом:

@echo off

for /r %%f in (*.js) do (
  echo %%f >> names.txt
)

pause

Мне не удалось распечатать каталог, в котором перечислены файлы .

Ответы [ 3 ]

2 голосов
/ 30 апреля 2020
@echo off
setlocal disabledelayedexpansion

set "lastdir="

(   for /r %%A in (*.js) do (
        set "nextdir=%%~dpA"

        setlocal enabledelayedexpansion
        if /i not "!lastdir!" == "!nextdir!" (

            rem Empty line and directory path.
            if defined lastdir @echo(
            @echo !nextdir!
        )
        endlocal

        rem Filename.
        @echo %%~nxA

        set "lastdir=%%~dpA"
    )
) > "names.txt"

Переменная lastdir предназначена для записи последнего пути к каталогу, поэтому он отображается только один раз.

Если lastdir отличается от %%~dpA:

  • Если определено lastdir, то будет отображаться пустая строка.
  • Путь к каталогу найденного файла отображается.

Имя файла всегда отображается.

for модификаторы dp - это диск и путь. nx - это имя и расширение.

setlocal enabledelayedexpansion используется только там, где это необходимо, поэтому пути с ! не уязвимы.

Я не собираюсь предлагать решение для командной строки, так как это было бы очень долго. Вместо этого предложите использовать команду tree, если формат вывода подходит.

0 голосов
/ 29 апреля 2020

Два простых способа сделать это:

dir /S *.js

Вы получаете ответы так же, как и просили.

FORFILES /S /M *.js /C "cmd /c echo @path"

Вы получаете полный путь для каждого файла.

0 голосов
/ 29 апреля 2020

Вот непроверенный пример, (я не ожидаю, что он будет быстрым, если ваш базовый каталог большой) :

@Echo Off
(
    For /F "Delims=" %%G In ('Dir /B /S /A:D "C:\Project" 2^> NUL') Do (
        %__AppDir__%where.exe /Q "%%G":*.js 1> NUL 2> NUL
        If Not ErrorLevel 1 (
            Echo/
            Echo %%G
            For /F "EOL=| Delims=" %%H In ('%__AppDir__%where.exe "%%G":*.js')Do (
                Echo %%~nxH
            )
        )
    )
) 1> "names.txt"
Pause

Если вы предпочитаете что-то запускать из команды Подскажите, затем попробуйте эту версию:

(For /F "Delims=" %G In ('Dir /B/S/AD "C:\Project" 2^>NUL')Do @(%__AppDir__%where.exe /Q "%G":*.js >NUL 2>&1&&(Echo/&Echo %G&For /F "EOL=|Delims=" %H In ('%__AppDir__%where.exe "%G":*.js')Do @Echo %~nxH)))>"names.txt"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...