【问题标题】:VS 2012: Post Build xcopy error 2VS 2012:构建后 xcopy 错误 2
【发布时间】:2012-12-10 11:41:39
【问题描述】:

我想让 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 库\MyNetWorkProject\Debug\IncNetworkLibD.lib xcopy "C:\Users\Incubbus\Documents\Visual Studio 2010\My 库\MyNetWorkProject\Debug\IncNetworkLibD.lib" "C:\Users\Incubbus\Documents\Visual Studio 2010\My Libraries\z.lib" /Y

:VCEnd" 以代码 2 退出。

我也想知道错误消息的命令字符串中的:VCEnd

任何帮助和提示都会被愉快地使用:)...

部分解决方案:

EDIT:当 xcopy 询问这是文件还是目录时,看起来 重命名 部分(Inc.libz.lib)会造成麻烦。 .当我只是将最初命名的文件复制到目录而不是复制重命名时,它可以工作

【问题讨论】:

  • 将项目文件中的 PostBuildEvent 复制/粘贴到您的问题中。不要编辑它,让它看起来完全一样。
  • 看起来重命名部分(Inc.lib 到 z.lib)很麻烦,当 xcopy 询问这是一个文件还是一个目录时......当我只复制 lib-file 时这有效到一个目录而不重命名它...
  • stackoverflow.com/a/4283533/532647 一种可能的解决方法。通过echo f | xcopy ...,您只需对 xcopy 说“文件”即可。
  • 工作,谢谢...如果您将其发布为答案,我可以将问题标记为已回答...

标签: visual-studio msbuild visual-studio-2012 xcopy post-build-event


【解决方案1】:

Xcopy documentation 说如下:

指定 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 |前缀,它基本上做了以下事情:它模拟用户在xcopy询问时按下f键。

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

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 points out,此 hack 无法在本地化版本的 Windows 下运行。 但是,另一个 hack 将起作用:

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

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

【讨论】:

  • 这在本地化版本的 Windows 下不起作用,提示词可能不同。另一种技巧是在目标末尾添加一个星号“*”,然后 xcopy 不会提示输入文件/目录。
  • 当源和/或目标具有文件扩展名时,为什么 xcopy 不能将它们识别为文件?为什么星号有效? @Govert
  • @xr280xr 我不知道 xcopy 是如何工作的。问 Raymond Chen 可能是个好问题:blogs.msdn.com/b/oldnewthing
  • @xr280xr 后面有一个点和一些字符不会使路径成为文件。文件夹名称中可以有点,即 aaa.txt 是有效的文件夹名称。
  • @xr280xr 没有文件,只有路径,不能仅根据路径决定目标是什么,因为文件夹名称可以有“扩展名”,文件名可能没有扩展名。将文件复制到文件夹是有效的操作,因此也无法确定来源。 xcopy 似乎忽略了目录的通配符,这可能就是为什么带有通配符的路径被认为是文件的原因。为避免混淆和黑客攻击,请使用文件副本。
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

    • 绝对最简单的答案。谢谢。
    猜你喜欢
    • 2012-06-28
    • 1970-01-01
    • 1970-01-01
    • 2014-10-21
    • 1970-01-01
    • 2012-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多