我正在开发一个项目,要求通过构建我的解决方案生成的DLL从bin文件夹复制到另一个文件夹,这两个文件夹都在我的机器上,在我的C盘中。我编写了一个使用xcopy来完成此任务的批处理文件,您可以在此处看到:
xcopy /s /y /q "C:\Users\scogan\Documents\Visual Studio 2012\Projects\Organizr\Server\bin\Debug\Organizr.Services.dll" "C:\inetpub\wwwroot\AppServer\bin\"
xcopy /s /y /q "C:\Users\scogan\Documents\Visual Studio 2012\Projects\Organizr\Server\bin\Debug\Organizr.Services.pdb" "C:\inetpub\wwwroot\AppServer\bin\"
现在,我尝试了多次此文件的迭代,它位于:
C:\Users\scogan\Desktop\CopyFiles.bat
所以我的post-build事件命令行如下所示:
call C:\Users\scogan\Desktop\CopyFiles.bat
我自己运行这个批处理文件,桌面上的文件夹中有两个文本文件,它运行正常。我也运行它,因为我需要自己复制的文件,这也很好。但是,当我尝试将其作为构建后事件运行时,我得到了这个输出:
1> Organizr -> C:\Users\scogan\Documents\Visual Studio 2012\Projects\Organizr\Client\bin\Debug\Organizr.exe
1> File not found - Organizr.Services.dll
1> 0 File(s) copied
1> 0 File(s) copied
1> File not found - Organizr.Services.pdb
1>c:\Windows\Microsoft.NET\Framework\v4.0.30319\Microsoft.Common.targets(4291,5): error MSB3073: The command "call C:\Users\scogan\Desktop\CopyFiles.bat" exited with code 4.
我做了一些研究,发现错误代码4意味着“发生了初始化错误。没有足够的内存或磁盘空间,或者您在命令行上输入了无效的驱动器名称或无效的语法。”
我也查了解MSB3073是什么,并没有真正找到可以帮助我的东西。所以,我的问题是我做错了什么?绝对路径是否会搞砸?感谢您的任何帮助。
答案 0 :(得分:23)
使用不同的项目属性,我发现项目构建顺序是问题所在。生成我想要复制的文件的项目是构建第二,但是作为构建后事件运行批处理文件的项目是第一个,所以我只是将构建事件附加到第二个项目,它工作得很好。感谢大家的帮助。
答案 1 :(得分:14)
首先在AfterBuild目标中通过构建后事件执行MsBuild“复制”任务。
将此Target附加到项目文件中并删除PostBuildEvent。
<Target Name="AfterBuild">
<Copy SourceFiles="C:\Users\scogan\Documents\Visual Studio 2012\Projects\Organizr\Server\bin\Debug\Organizr.Services.*"
DestinationFolder="C:\inetpub\wwwroot\AppServer\bin\"
OverwriteReadOnlyFiles="true"
SkipUnchangedFiles="false" />
</Target>
答案 2 :(得分:9)
对于它的价值,我的案例中的问题是由于使用'/'作为copy
命令中的目录分隔符引起的。必须使用反斜杠。
答案 3 :(得分:5)
就我而言,我通过构建项目创建的dll仍然在后台使用。我杀死了应用程序,然后xcopy按预期工作正常。
答案 4 :(得分:2)
现在为时已晚,但是为稍后再看的人发布了我的经验: - 在MS VS 2010中,我遇到了同样的问题。通过在构建包含空格的构建复制命令args中添加引号来解决它。
在项目属性中 - &gt;配置属性 - &gt;构建事件 - &gt;构建后事件 - &gt;命令行已更改
复制$(ProjectDir)a \ b \ c $(OutputPath)
到
复制&#34; $(ProjectDir)a \ b \ c&#34; &#34; $(OutputPath)&#34;
答案 5 :(得分:2)
指定的错误与post built事件有关。不知何故,VS工具无法将文件复制到目标文件夹。这可能有很多原因。要检查确切的错误原因,请转到工具&gt;选项&GT;项目和解决方案&gt;构建并运行,并更改&#34; MsBuild项目构建输出详细程度&#34;到&#34; 诊断&#34;。它将为您提供足够的信息来检测实际问题。
答案 6 :(得分:1)
如果在将构建完成后放入正确的项目后问题仍然存在,请尝试使用&#34;复制&#34;而不是xcopy。这对我有用。
答案 7 :(得分:1)
导入项目的构建后事件(在“构建事件”下的“属性”对话框中)具有未定义的环境变量。
导航到Control Panel\All Control Panel Items\System\Advanced system settings
以添加相应的environment variable, and doing no more而不是重新启动VS2017解决了错误
此外,继续@Seans以及有关多个项目竞赛/争用的其他答案,在输出文件夹中创建一个临时文件夹,如下所示,
并选择产生首选输出的项目:
和构建(没有重建/清理)是一个快速的解决方案。
答案 8 :(得分:1)
我通过执行以下操作解决了该问题: 在Visual Studio中,我进入了Project-> Project Dependencies
我选择了XXX.Test解决方案,并告诉它它也依赖XXX解决方案来使XXX.Test解决方案中的生成后事件不会产生此错误(退出代码4)。
此致
答案 9 :(得分:1)
如果您遇到复制命令的某些问题
答案 10 :(得分:0)
我的Test项目遇到了同样的问题。我发现为什么我的帖子构建事件不起作用,这是因为我在运行$(ProjectName).exe命令之前复制文件,并且测试项目本身需要其中一些文件。因此,只需将$(ProjectName).exe作为第一个命令来解决问题。
答案 11 :(得分:0)
我发现当你有多个项目并行构建并且一个或多个项目试图复制相同的文件时会出现问题,从而产生会导致偶然错误的竞争条件。那怎么解决呢?
有很多选择,因为上面只是改变一些事情可以解决一些人的问题。更强大的解决方案将是......
一个。限制正在复制的文件,即代替xcopy $(TargetDir)。“...而不是xcopy”$(TargetDir)$(TargetName)。*“...
湾抓住错误并重试,即
:loop
xcopy /Y /R /S /J /Q "$(TargetDir)$(TargetName).*" "somewhere"
if ErrorLevel 1 goto loop
℃。用户robocopy而不是xcopy
答案 12 :(得分:0)
我最近遇到了这个问题,令人惊讶的是,只有我遇到了这个问题,而在构建项目代码时,我的团队成员都没有遇到这个问题。
在调试时,我发现我的代码目录存在间距问题,它是D:\ GIT Workspace \ abc \ xyz。
作为快速解决方案,我将其更改为D:\ GITWS \ abc \ xyz并解决了问题。
答案 13 :(得分:0)
从Github下载一些源代码后,我得到了这个错误。特别是防锈氧化物的开发框架。我的问题是,用于更新Steam中某些dll的Steam.ps1脚本文件被操作系统阻止。我不得不打开文件属性进行解锁。我还没有意识到这对ps1文件和exe都适用。