Как скопировать из нескольких каталогов релиза в одну папку - PullRequest
1 голос
/ 17 июля 2009

Хорошо, это не связано с программированием, я думаю ...

У меня есть целый ряд небольших полезных консольных утилит, разбросанных по набору проектов, которые я написал, и я хочу поместить их все в один каталог, чтобы упростить их использование. Единственная проблема заключается в том, что они все скомпилированы как в режиме отладки, так и в режиме выпуска.

Учитывая, что мне нужны только версии режима выпуска в моем каталоге утилит, какой переключатель позволит мне указать, что я хочу, чтобы все исполняемые файлы были из моей древовидной структуры, но только из папок Release:

Пример:

Projects\   
  Project1\
    Bin\
      Debug\
        Project1.exe
      Release\
        Project1.exe   
  Project2\

и т. Д. И т. Д. *

К

Utilities\
  Project1.exe
  Project2.exe
  Project3.exe
  Project4.exe
  ...

и т. Д. И т. Д. *

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

Есть идеи?

Ответы [ 5 ]

1 голос
/ 17 июля 2009

Вы можете ограничить его только выпуском исполняемых файлов со следующим. Тем не менее, я не верю, что другое требование выравнивания возможно при использовании только xcopy. Чтобы сделать ограничение:

Сначала создайте файл, например exclude.txt , и поместите его внутрь:

\Debug\

Затем используйте следующую команду:

xcopy /e /EXCLUDE:exclude.txt *.exe C:\target

Вы можете, однако, выполнить то, что вы хотите, используя xxcopy (бесплатно для некоммерческого использования). Прочитайте технический бюллетень # 16 для объяснения особенностей сплющивания.

Если утверждение в этом техническом бюллетене правильное, то это подтверждает, что выравнивание не может быть выполнено только с помощью xcopy.

Следующая команда будет делать то, что вы хотите, используя xxcopy:

xxcopy /sgfo /X:*\Debug\* .\Projects\*.exe  .\Utilities

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

0 голосов
/ 17 июля 2009

Это может помочь вам начать:

C:\>for %i in (*) do  dir "%~dpi\*.exe"

Используется в команде dir в качестве модификатора для i, ~ dp использует диск и путь всего найденного в (*). Если я запускаю вышеупомянутое в папке, которая имеет несколько подпапок, содержащих исполняемые файлы, я получаю список директорий всех исполняемых файлов в каждой папке.

Вы сможете изменить это, добавив '\ bin \ release \' после части ~ dpi и изменив dir на xcopy. Небольшой эксперимент должен сделать это довольно легко.

Чтобы использовать приведенный выше оператор for в пакетном файле, измените «%» на «%%» в обоих местах.

0 голосов
/ 17 июля 2009

Это может не помочь вам собрать их все в одном месте, но в будущем вы рассматриваете возможность добавления события после сборки к проектам в Visual Studio (я предполагаю, что вы используете его на основе имен каталогов)

xcopy / Y / I / E "$ (TargetDir) \ $ (TargetFileName)" "c: \ somedirectory \ $ (TargetFileName)"

0 голосов
/ 17 июля 2009

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

# From the base directory
mkdir Utilities
find . -type f | grep -w Release > utils.txt
for f in $(<utils.txt); do cp $f Utilities/; done

Вы можете объединить строки find и cp в одну, я разделил их для удобства чтения.

Чтобы сделать это на компьютере с Windows, вам понадобится Cygwin или несколько таких удобных утилит Unix.
Может быть, есть инструменты в оболочке Windows, чтобы сделать это ...

0 голосов
/ 17 июля 2009

Извините, я еще не пробовал, но вы не должны использовать:

xcopy release * .exe d: \ destination / s

Я в настоящее время на моем Mac, поэтому я не могу проверить, чтобы быть уверенным.

...