Запустите команду во всех подпапках в пакетном файле.

Вопрос или проблема

У меня есть пакетный файл, который выглядит так:

IF EXIST icon.ico (
    attrib -S -H -R desktop.ini
    echo f | xcopy /H /Y "%~dp0desktop.ini.txt" desktop.ini
    attrib +S +H +A desktop.ini
)

Это идеально подходит для моих нужд.
Мой вопрос: как заставить это работать во всех подкаталогах?

Как выполнить команду во всех подкаталогах в пакетном файле?

Вы можете использовать for /r для этого.

Используйте следующий пакетный файл:

for /r "starting_directory" %%a in (.) do (
  pushd %%a
  if exist icon.ico (
    attrib -s -h -r desktop.ini
    echo f | xcopy /h /y "%~dp0desktop.ini.txt" desktop.ini
    attrib +s +h +a desktop.ini
    ) 
  popd 
  )

for /r – Цикл по файлам (Рекурсивно по подкаталогам)

Синтаксис

FOR /R [[диск:]путь] %%параметр В (набор) DO команда

Ключ

диск:путь : Древо папок, в котором находятся файлы.

набор : Набор одного или нескольких файлов. Должны использоваться символы подстановки.
Если (набор) – это символ точки (.), то FOR будет
циклом по каждой папке.

команда : Команда(ы) для выполнения, включая любые
параметры командной строки.

%%параметр` : Заменяемый параметр:
в пакетном файле используйте %%G (в командной строке %G)

Источник for /r – Цикл по файлам (Рекурсивно по подкаталогам).


Дополнительное чтение

Ответ или решение

Как выполнить команду во всех подкаталогах с помощью пакетного файла

Вам нужно выполнить команды в каждом подкаталоге, используя пакетный файл Windows. Для решения данной задачи удобен цикл for /r, который рекурсивно проходит по всем подкаталогам заданной директории. В представленном ниже решении вы узнаете, как адаптировать ваш текущий скрипт для работы во всех подкаталогах.

Шаги для реализации

  1. Инициализация цикла: Сначала вам нужно указать начальную директорию для рекурсии. Подходящий синтаксис будет следующим:

    for /r "начальная_директория" %%a in (.) do (
  2. Переход в директорию: Используйте команду pushd для смены текущей директории на ту, что указана в %%a.

  3. Логика выполнения команд: Внутри цикла вы можете вставить ваши команды, аналогично тому, как это реализовано в вашем изначальном скрипте.

  4. Возврат в родительскую директорию: После выполнения команд в подкаталоге используйте команду popd для возвращения к родной директории.

Пример пакетного файла

Ниже представлен пример пакетного файла, адаптированного для выполнения ваших команд во всех подкаталогах:

@echo off
rem Установите начальную директорию
set "starting_directory=C:\путь\к\вашей\директории"

for /r "%starting_directory%" %%a in (.) do (
    pushd %%a
    if exist icon.ico (
        attrib -S -H -R desktop.ini
        echo f | xcopy /H /Y "%~dp0desktop.ini.txt" desktop.ini
        attrib +S +H +A desktop.ini
    )
    popd
)

Объяснение кода

  • @echo off: Отключает вывод команд в консоль для более аккуратного отображения.
  • set "starting_directory=C:\путь\к\вашей\директории": Устанавливает путь, с которого начинать рекурсию.
  • for /r "%starting_directory%" %%a in (.): Цикл проходит по каждому подкаталогу в заданной директории.
  • pushd %%a: Переход в текущий подкаталог %%a.
  • if exist icon.ico: Проверяет наличие файла icon.ico.
  • attrib и xcopy: Ваша логика для работы с файлами.
  • popd: Возврат в родительскую директорию после выполнения команд.

Заключение

Используя этот подход, вы сможете эффективно выполнять команды во всех подкаталогах, сохраняя ту же функциональность, что и в вашем исходном скрипте. Это решение хорошо подходит для автоматизации рутинных задач в Windows, например, настройки атрибутов файлов или копирования шаблонов. Не забудьте менять путь в строке set на тот, который вам нужен.

Рекомендуемые ресурсы

Эти ресурсы помогут вам лучше понять команды и их возможности, а также оптимизировать ваши скрипты для различных задач.

Оцените материал
Добавить комментарий

Капча загружается...