рекурсивно искать определенный каталог в командном файле - PullRequest
0 голосов
/ 10 мая 2018

Я пытаюсь создать командный файл, который будет работать как скрипт сборки. Я хочу скопировать все библиотеки в любом каталоге bin / debug из проектов в моем решении в конкретный каталог. Я просто не уверен, как определить, заканчивается ли каталог на bin / debug в цикле for.

for /D /R "D:\mysolution\" %%F in ( *.* ) DO (
    rem if directory ends in "bin\debug"
    copy %%F\*.dll %1
)

Ответы [ 4 ]

0 голосов
/ 10 мая 2018

Вы можете использовать другой for цикл вместе с ~ модификаторами , чтобы также определить имя родительского каталога, затем давайте проверим частичный путь bin\debug :

for /D /R "D:\mysolution\" %%J in ("*") do (
    for %%I in ("%%~dpJ.") do (
        if /I "%%~nxI\%%~nxJ"=="bin\debug" (
            copy "%%~J\*.dll" "%~1"
        )
    )
)
0 голосов
/ 10 мая 2018
@ECHO OFF
SETLOCAL
SET "sourcedir=m:\tokyo"
SET "destdir=u:\destdir"

FOR /r "%sourcedir%" %%a IN (*.dll) DO (
 FOR %%t IN ("%%~dpa.") DO (
  IF /i "%%~nxt" == "bin64" ECHO(copy "%%a" "%destdir%"
  IF /i "%%~nxt" == "bin" ECHO(copy "%%a" "%destdir%"
 )
)

GOTO :EOF

Вам необходимо изменить настройки sourcedir и destdir в соответствии с вашими обстоятельствами.

Необходимые команды COPY просто ECHO отредактированы для целей тестирования. После проверки правильности команд измените ECHO(COPY на COPY, чтобы фактически скопировать файлы. Добавьте >nul для подавления сообщений отчета (например, 1 file copied)

Я выбрал .dll файлы из моих каталогов M:\tokyo...\bin64 и M:\tokyo...\bin для удобства тестирования.

Используйте for/r, чтобы найти все файлы .dll, начиная с назначенного каталога, присваивая каждому по очереди %%a.

Назначьте литерал (диск + путь) от %% a + . до %%t, получив непосредственное имя родительского каталога в качестве «имени файла», и сравните с регистр-нечувствительностью (/i) «имя файла» для каждая нужная строка по очереди. Это обеспечивает сравнение полного parent-directoryname, поэтому у нас нет ложных совпадений с таким именем, как not_this_directory_even_though_its_a_bin.

0 голосов
/ 10 мая 2018

На основании вашего теперь проверенного намерения, то есть деревьев, оканчивающихся на \bin\debug, это предварительно фильтрует результаты рекурсии каталога, а затем проверяет имя перед выполнением команды Copy:

@Echo Off
If "%~1"=="" (Exit /B) Else CD /D "%~1" 2>Nul && (Set "CP=Copy /Y "%%A\*.dll" 2>Nul") || Exit /B
For /D /R "D:\mysolution" %%A In (bin\d?bug) Do For %%B In ("%%~nxA.") Do If /I "%%~nB"=="debug" %CP%

Это должно работать, только если ваш входной аргумент [0], %1 предоставлен и существует.

0 голосов
/ 10 мая 2018

Вам нужно delayedexpansion на этом, потому что мы set переменная внутри блока кода ( )

Обычно мы просто сообщаем ему, что если последние 3 символа папки = bin или последние 5 символов = debug, что-то делают:

@echo off
setlocal enabledelayedexpansion
for /D /R "D:\mysolution\" %%F in (*) DO (
   set "var=%%F"
   if /i "!var:~-3!"=="bin" copy "!var!\*.dll" %1
   if /i "!var:~-5!"=="debug" copy "!var!\*.dll" %1
)

Это скопирует все dll из каталогов с именами: bin debug SOME dir NAME debug MYbin и т. Д., Но не из debug dir bin dir и т. Д.

EDIT

После вашего комментария это должно сделать:

@echo off
setlocal enabledelayedexpansion
for /D /R "D:\mysolution\" %%F in (*) DO (
   set "var=%%F"
   if /i "!var:~-9!"=="bin\debug" copy "!var!\*.dll" %1
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...