113

我有一个带有后期构建事件的项目:

copy $(ProjectDir)DbVerse\Lunaverse.DbVerse.*.exe  $(TargetDir)

每次在我的机器上都能正常工作。我有一个新开发人员,他总是收到“以代码 1 退出”错误。我让她在 DOS 提示符下运行相同的命令,它运行良好。这可能是什么原因造成的?有没有办法解决真正的错误?

我们都使用 Visual Studio 2008。

4

19 回答 19

119

她在路径中的一个文件夹名称中有一个空格,并且没有引号。

于 2008-11-21T21:52:13.697 回答
60

带有“Pings”的那个帮助了我......但可能会更好地解释......

对我来说,解决方案是改变:

copy $(TargetDir)$(TargetName).* $(SolutionDir)bin

对此:

copy "$(TargetDir)$(TargetName).*" "$(SolutionDir)bin"

希望对你有效。:-)

于 2010-02-18T19:51:26.973 回答
56

我已经为未来的访客添加了这个,因为这是一个非常活跃的问题。

ROBOCOPY 以低于 8 的“成功代码”退出。请参阅:http: //support.microsoft.com/kb/954404

这意味着:

robocopy exit code 0 = no files copied
robocopy exit code 1 = files copied
When the result is 1, this becomes an error exit code in visual studio.

所以我通过将它添加到批处理文件的底部轻松解决了这个问题

exit 0

建议以这种方式处理 ROBOCOPY 错误

rem each robocopy statement and then underneath have the error check.
if %ERRORLEVEL% GEQ 8 goto failed

rem end of batch file
GOTO success

:failed
rem do not pause as it will pause msbuild.
exit 1

:success
exit 0    

当没有文件被复制时会出现混乱= VS 中没有错误。然后,当发生更改时,文件确实会被复制,VS 错误,但开发人员想要的一切都已完成。

附加提示:不要在脚本中使用暂停,因为这将成为 VS 构建中的无限暂停。在开发脚本时,使用类似timeout 10. 您会注意到这一点并将其注释掉,而不是挂起构建。

于 2012-05-04T01:52:45.500 回答
47

我选择代码 1 的原因是目标文件夹是只读的。希望这对某人有帮助!我有一个构建后事件来从一个目录复制到另一个目录,并且目标是只读的。所以我只是去取消选中目录及其所有子目录的只读属性!只要确保它是一个安全的目录!

于 2010-12-27T22:01:36.353 回答
11

从 SysInternals获取进程监视器 设置它来监视 Lunaverse.DbVerse(在 Path 字段上)查看操作结果。从那里应该很明显出了什么问题

于 2008-11-21T20:50:34.803 回答
8

我必须以管理员身份运行 VS 才能让我的构建后副本到受操作系统保护的“..\Common7\IDE\PrivateAssemblies”才能工作

于 2012-04-30T21:31:42.240 回答
6

我有一个类似的问题,但特别是在 Jenkins 构建环境中。为了解决这个问题,我从在构建后事件中使用复制命令切换到使用复制目标。

我改变了这个:

   <PropertyGroup>
      <PostBuildEvent>copy $(ProjectDir)bin\BLAH.Common.xml $(ProjectDir)App_Data\BLAH.Common.xml</PostBuildEvent>
   </PropertyGroup>

对此:

  <Target Name="AfterBuild">
    <Copy SourceFiles="$(ProjectDir)bin\BLAH.Common.xml" DestinationFolder="$(ProjectDir)App_Data\" />
  </Target>

现在工作正常。

我得到的具体错误是:

(PostBuildEvent target) -> 
  C:\Windows\Microsoft.NET\Framework\v4.0.30319\Microsoft.Common.targets(4291,5): error MSB3073: The command "copy <http://1.2.3.4/job/BLAHv2/ws/Api/bin/BLAH.Common.xml> <http://1.2.3.4/job/BLAHv2/ws/Api/App_Data/BLAH.Common.xml"> exited with code 1. [<http://1.2.3.4/job/BLAHv2/ws/Api/Api.csproj]>
于 2016-10-31T15:04:19.227 回答
5

对于那些在项目->属性中的构建事件预构建事件命令行或/和构建后事件命令行)中使用“复制”命令的人:您的“复制”命令参数应如下所示:。请记住使用引号(以避免地址字符串中的空格出现问题)。copy "source of files" "destination for files"

于 2012-12-27T14:13:12.717 回答
3

我能够通过以管理员身份运行 Visual Studio 来修复我的代码 1。显然它没有权限在没有管理员的情况下执行 shell 命令。

于 2014-08-19T17:45:48.947 回答
3

好的,这是一个有很多解决方案的问题,所以我只是发布我的问题来给人们更多的提示。我的情况是仔细检查路径中的文件夹并确保它们都存在于您的机器中。例如:“$(SolutionDir)\partBin\Bin\$(ProjectName).pdb”,但“Bin”不在 partBin 文件夹中。

于 2014-08-28T13:59:29.547 回答
2

作为一个好的做法,我建议您用MS Build File Copy 任务替换 post build 事件。

于 2008-11-21T21:58:28.443 回答
2

对我来说,我必须确保我正在处理文件的程序当时没有运行。语法没有任何错误。希望这可以帮助某人。

于 2011-07-18T14:18:04.733 回答
2

我刚刚收到同样的错误。我在目标路径中有一个 % 需要转义

c:\projects\%NotAnEnvironmentVariable%

需要是

c:\projects\%%NotAnEnvironmentVariable%%
于 2012-12-01T18:26:12.777 回答
2

对于那些在项目 - > 属性中的构建事件(构建前事件命令行或/和构建后事件命令行)中使用“复制”命令的人:目标文件夹应该存在

于 2016-03-21T14:51:01.103 回答
0

这么多解决方案...

就我而言,我必须使用非 unicode(西方,Windows)编码保存 bat 文件。默认情况下,当我将文件添加到 Visual Studio 时(可能我应该在 VS 之外完成),它添加了 UTF-8 编码。

于 2014-02-14T02:24:35.323 回答
0

我遇到了同样的问题,原来是因为我重命名了项目。我进入项目属性并将程序集名称和根命名空间更改为项目名称,之后效果很好!

于 2015-07-06T15:43:11.637 回答
0

还有一个答案...

就我而言,我有一个针对 .Net Standard 1.3 和 .Net Framework 2.0 的 Visual Studio 2017 项目。这是在 .csproj 文件中指定的,如下所示:

<TargetFrameworks>netstandard1.3;net20</TargetFrameworks>

我还有一个像这样的构建后事件命令行:

copy "E:\Yacks\YacksCore\YacksCore\bin\net20\Merlinia.YacksCore.dll" "E:\Merlinia\Trunk-Debug\Shared Bin\"

换句话说,我试图将构建生成的 .Net Framework .dll 复制到另一个位置。

当我进行重建时,此错误失败:

MSB3073 The command "copy "E:\Yacks\YacksCore\YacksCore\bin\net20\Merlinia.YacksCore.dll" "E:\Merlinia\Trunk-Debug\Shared Bin\"" exited with code 1.

经过一番挫折后,我终于确定发生的事情是 Rebuild 删除了所有输出文件,然后为 .Net Standard 1.3 进行了构建,然后尝试运行构建后事件命令行,但由于要复制文件而失败还没有建成。

所以解决办法是改变构建顺序,即先构建.Net Framework 2.0,然后构建.Net Standard 1.3。

<TargetFrameworks>net20;netstandard1.3</TargetFrameworks>

这现在可以工作了,构建后事件命令行运行两次的小故障,因此文件被复制了两次。

于 2018-06-19T04:11:50.623 回答
0

在我的情况下,我必须cd在调用 bat 文件之前(更改目录),因为 bat 文件内部是一个指定相对路径的复制操作。

:: Copy file
cd "$(ProjectDir)files\build_scripts\"
call "copy.bat"
于 2019-08-07T06:07:55.933 回答
0

对我来说,原因是构建在构建输出文件夹(x86)上创建了一个平台文件夹,修复是在 VS 中将解决方案平台从“混合平台”更改为“任何 CPU”

VS 2019

于 2021-03-08T15:48:42.483 回答