20

我想让 VS 将它在构建过程之后创建的 .lib 文件复制到特定文件夹。所以我去了项目配置,构建后事件,并输入了以下命令:

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

但是,在我单击“构建”后,复制过程并没有失败,而是收到以下错误:

错误 MSB3073:命令“如果存在 C:\Users\Incubbus\Documents\Visual Studio 2010\My Libraries\MyNetWorkProject\Debug\IncNetworkLibD.lib xcopy "C:\Users\Incubbus\Documents\Visual Studio 2010\My Libraries\MyNetWorkProject \Debug\IncNetworkLibD.lib" "C:\Users\Incubbus\Documents\Visual Studio 2010\My Libraries\z.lib" /Y

:VCEnd" 以代码 2 退出。

我也想知道:VCEnd错误消息的命令字符串中的<-也许这就是原因?如何解决这个问题?

任何帮助和提示都会被愉快地消耗掉:)...

部分解决方案:

编辑:看起来重命名部分(Inc.libto z.lib)很麻烦,当 xcopy 询问这是一个文件还是一个目录时......当我只是将最初命名的文件复制到目录而不是复制重命名时它可以工作

4

3 回答 3

38

Xcopy 文档说明如下:

指定 Destination 是文件还是目录 如果 Destination 不包含现有目录且不以反斜杠 (\) 结尾,则会显示以下消息:

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

如果您想将一个或多个文件复制到一个文件中,请按 F。如果要将文件复制到目录中,请按 D。

您可以通过使用 /i 命令行选项来禁止显示此消息,xcopy如果源是多个文件或目录,这会导致假定目标是一个目录。

你需要相反的,但没有这样的开关。

此处提出了解决方案:https ://stackoverflow.com/a/4283533/532647 。

建议在xcopy命令前加上前缀,它基本上做了以下事情:它在询问时echo f |模拟用户按键。fxcopy

所以你的命令应该是这样的:

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

操作员只是将(== )|的输出通过管道传输到命令中,并在适当的时候读取它。有关此处输出重定向的更多信息:http: //ss64.com/nt/syntax-redirection.htmlecho ffxcopy

更新: 正如 Govert指出的那样,这个 hack 在本地化版本的 Windows 下不起作用。但是,另一个 hack 将起作用:

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

用星号附加目标文件名*使 xcopy 不会询问目标是文件还是目录。

于 2012-12-24T13:58:26.253 回答
12

为什么不使用 copy 而不是 xcopy?副本专门用于文件,因此不会造成混淆。

于 2014-10-08T17:22:32.933 回答
1

您是否尝试将 $(TargetPath) 用引号括起来?一直如此流行的空格字符而不是下划线在所有 MS 产品中往往会在每个角落都搞砸……不知道为什么那些笨蛋继续这样做……

像这样:如果存在 "$(TargetPath)"

于 2014-01-08T04:15:01.023 回答