Итерация списка каталогов и подкаталогов для запуска определенной команды под каждым из них в окнах - PullRequest
0 голосов
/ 15 февраля 2019

У меня есть родительская папка, содержащая несколько дочерних папок.Я пытаюсь запустить скрипт bat, который запускает определенную операцию в дочерних папках.Но я не хочу, чтобы скрипт запускался во всех дочерних папках.Мне нужно исключить несколько из списка.Вот что у меня сейчас:

pushd
for /D %%i in (<<path To Parent>>\*) do call :$myFunc "%%i"
popd
exit /B

:$myFunc
for %%g in ("Child2"
"Child3") do ( if /I "%1"=="%%~g" goto match )
echo current directory: %1
exit /B

:$match
echo matched directory
exit /B

В подпрограмме :$myFunc я могу сделать cd %1, чтобы войти в этот дочерний каталог и запустить мою команду, затем выполнить cd, чтобы вернуться кродительская папка.Прежде всего я пытаюсь исключить операцию :$myFunc, если входящая папка находится в моем списке исключений.

Дерево папок:

ParentFolder
  Child1
  Child2
  Child3
  Child4

Учитывая пример структуры папок, как выше, как я не могу вызвать myFunc, когда for выбирает Child2 и Child3.

Какие-либо предложения о том, как мне этого добиться?

1 Ответ

0 голосов
/ 15 февраля 2019

Это, безусловно, возможно и может быть сделано с помощью следующего кода (множество изменений):

@echo off
setlocal EnableDelayedExpansion

rem Set which folders to exclude. This is changeable and NOT HARDCODED:
set exclude_folders="Child2" "Child3"

for /F %%A IN ('dir /B /AD "<path to parent>"') do (
    if "!exclude_folders:%%~nxA=!" == "%exclude_folders%" (call :$myFunc "%%A" "%%~fA")
)
exit /b %errorlevel%


:$myFunc
pushd "%~2"
rem Do your commands here; don't use pushd again!
popd

Обратите внимание, что первым аргументом является имя папки, если оно находится в %cd%.Иначе, это полный путь.Второй аргумент является необязательным и более общим, но я уверен, что он вам понадобится!

Я изменил код следующим образом:

  • Создал переменную с именем exclude_folders для отображенияздесь папки, которые вы хотите выполнить.
  • Создан цикл for /F для циклического выполнения команды (dir /B /AD) для циклического просмотра всех папок, избегайте скрытых!
  • Если папкаимя (%%~nxA) [используется %%~nxA, поскольку папка может содержать точку (.)] исключена из exclude_folders, а переменная изменяется (другими словами, если строка foldername существуетв exclude_folders) это означает, что папка занесена в черный список, и цикл for начнется со следующей строки, поскольку для else нет команды.Если происходит обратное, подпрограмма call $myFunc с двумя аргументами: %%A и %%~fA
  • Введите некоторую команду в папке %~2 и вернитесь обратно в цикл.
  • Когда цикл завершится, скрипт будет exit.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...