VS 2012:后构建xcopy错误2

20

我希望使VS在构建过程后将其创建的.lib文件复制到特定文件夹中。 因此,我进入了项目配置、后期构建事件,并输入了以下命令:

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

但在点击“构建”后,复制过程失败,我收到以下错误:

error MSB3073: 命令“if exist 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.libz.lib)出现问题,当xcopy询问这是文件还是目录时...当我只是将原始命名的文件复制到目录中而不是复制重命名的文件时,它可以工作。


1
将您项目文件中的PostBuildEvent复制/粘贴到问题中。不要编辑它,使其看起来完全相同。 - Hans Passant
看起来重命名部分(从Inc.lib到z.lib)会出问题,当xcopy询问这是文件还是目录时...如果我只是将lib文件复制到目录中而不重命名它,则可以正常工作... - Juarrow
1
解决这个问题的一种可能的方法是使用 echo f | xcopy ...,这样你只需要对 xcopy 说“file”。 - Iarek
工作正常,谢谢...如果您将其发布为答案,我可以将问题标记为已回答... - Juarrow
3个回答

38

Xcopy文档指出:

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

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

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

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

您需要相反的操作,但没有这样的开关。

解决方案在这里提出:https://dev59.com/DG855IYBdhLWcg3wik-D#4283533

建议在xcopy命令前面添加echo 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

更新: 正如Govert在这里指出的,这种方法在本地化版本的Windows下不起作用。 然而,另一种方法可以使用:

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

在目标文件名后附加星号*可以使xcopy不询问目标是文件还是目录。


14
在本地化的 Windows 版本中,这种方法不起作用,因为提示词可能会有所不同。另一种替代方法是在目标路径末尾添加一个星号(*),这样 xcopy 就不会提示文件/目录了。 - Govert
为什么xcopy在源和/或目标具有文件扩展名时无法将其识别为文件,而星号却可以工作?@Govert - xr280xr
@xr280xr 我不知道xcopy是如何工作的。这可能是向Raymond Chen提问的好问题:http://blogs.msdn.com/b/oldnewthing - Govert
@xr280xr:路径中带有点和一些字符并不意味着它是一个文件。文件夹的名称中也可以包含点,例如aaa.txt就是一个有效的文件夹名称。 - user3285954
@user3285954 无论如何,为什么xcopy无法将文件识别为文件,使用星号为什么可以解决这个问题?(感谢链接,Govert) - xr280xr
1
@xr280xr 目前还没有文件,只有一个路径,并且仅凭路径无法确定目标是什么,因为文件夹名称可以带有“扩展名”,而文件名可能没有扩展名。将文件复制到文件夹是有效的操作,因此也无法根据源来确定。xcopy似乎忽略了目录的通配符,这可能是为什么带有通配符的路径被视为文件的原因。为避免混淆和漏洞,请使用copy命令来处理文件。 - user3285954

12

你为什么不使用复制而使用复制扩展命令(xcopy)呢?复制命令专门用于文件,因此不会产生混淆。


1
最简单的答案。谢谢。 - user1908746

1

你尝试过用引号将$(TargetPath)括起来吗?在所有微软产品中,空格字符比下划线更受欢迎,它们往往会在每个角落搞砸事情...不知道那些傻瓜为什么还要这样做...

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接