VS 2012: Post Build xcopy error 2

Я хочу, чтобы VS скопировал .lib файл, который был создан после процесса сборки в определенную папку. Поэтому я пошел в конфигурацию проекта, после сборки и ввел следующую команду:

if exist $(TargetPath)
xcopy "$(TargetPath)" "C:\Users\Incubbus\Documents\Visual Studio 2010\My Libraries\z.lib" /Y

Но вместо копирования процесс завершается с ошибкой после того, как я нажму "build", и я получаю следующую ошибку:

ошибка MSB3073: команда "if exist C:\Users\Incubbus\Documents\Visual Studio 2010\My Библиотеки \MyNetWorkProject\Debug\IncNetworkLibD.lib xcopy" C:\Users\Incubbus\Documents\Visual Studio 2010\My Библиотеки \MyNetWorkProject\Debug\IncNetworkLibD.lib "" C:\Users\Incubbus\Documents\Visual Studio 2010\Мои библиотеки \z.lib "/Y

: VCEnd" вышел с кодом 2.

Мне также интересно узнать о :VCEnd в командной строке сообщения об ошибке < - Возможно, это причина? Как это решить?

Любая помощь и подсказки будут с удовольствием использованы:)...

частичное решение:

EDIT: похоже, что переименование (Inc.lib - z.lib) создает проблемы, когда xcopy спрашивает, является ли это файлом или каталогом..it работает, когда я просто копирую первоначально названный файл в каталог вместо копирования переименованного

Ответ 1

Документация Xcopy сообщает следующее:

Указание того, является ли Destination файлом или каталогом Если Destination не содержит существующий каталог и не заканчивается обратным слэшем (\), появляется следующее сообщение:

Does destination specify a file name 
or directory name on the target 
(F = file, D = directory)? 

Нажмите F, если вы хотите, чтобы файл или файлы были скопированы в файл. Нажмите D, если вы хотите скопировать файл или файлы в каталог.

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

Вам нужно обратное, но такого переключателя нет.

Решение предлагается здесь: fooobar.com/questions/79409/....

Предлагается добавить команду xcopy с префиксом echo f |, который в основном делает следующее: он имитирует пользователя, нажимая клавишу f, когда запрашивает xcopy.

Итак, ваша команда должна выглядеть так:

if exist $(TargetPath)
echo f | xcopy "$(TargetPath)" "C:\Users\Incubbus\Documents\Visual Studio 2010\My Libraries\z.lib" /Y

Оператор | просто передает вывод echo f (== f) в команду xcopy, и при необходимости считывается. Подробнее о перенаправлении вывода здесь: http://ss64.com/nt/syntax-redirection.html.

UPDATE: Как указывает Govert , этот хак не будет работать под локализованной версией Windows. Однако другой хак будет работать:

xcopy D:\file.zip c:\renamedFile.zip*

Добавление имени целевого файла со звездочкой * делает xcopy не спрашивать, является ли целевой файл или каталог.

Ответ 2

Почему вы не используете копию вместо xcopy? копия специально предназначена для файлов, поэтому не будет путаницы.

Ответ 3

Вы пытались обернуть $(TargetPath) в кавычки? Все-так популярны-пробелы-символы-вместо-подчеркивают-в-все-MS-продукты, как правило, испортить вещи на каждом углу... Не знаю, почему эти dumbos продолжают делать это...

Так же: если существует "$ (TargetPath)"