我正在开发一个项目,要求通过构建我的解决方案生成的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是什么,并没有真正找到可以帮助我的东西。所以,我的问题是我做错了什么?绝对路径是否会搞砸?任何帮助在这里表示赞赏。
使用不同的项目属性,我发现项目构建顺序是问题。生成我想要复制的文件的项目是第二个,但是首先构建了作为构建后事件运行批处理文件的项目,所以我只是将构建事件附加到第二个项目,它只是工作精细。不过,感谢大家的帮助。
如果您遇到复制命令的某些问题,请在执行复制命令之前执行以下操作
我的测试项目遇到了同样的问题。我发现为什么我的帖子构建事件不起作用,那是因为我在运行$(ProjectName).exe命令之前复制文件,并且测试项目本身需要其中一些文件。因此,只需将$(ProjectName).exe作为第一个命令来修复问题。
我发现当你有多个项目并行构建并且一个或多个项目试图复制相同的文件时会出现问题,从而产生会导致偶然错误的竞争条件。那怎么解决呢?
有很多选择,因为上面只是改变一些事情可以解决一些人的问题。更强大的解决方案将是......
一个。限制正在复制的文件,而不是xcopy $(TargetDir)。“...而是执行xcopy”$(TargetDir)$(TargetName)。*“...
湾抓住错误并重试,即
:loop
xcopy /Y /R /S /J /Q "$(TargetDir)$(TargetName).*" "somewhere"
if ErrorLevel 1 goto loop
C。用户robocopy而不是xcopy
首选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>
对于它的价值,我的案例中的问题是由于使用'/'作为copy
命令中的目录分隔符引起的。必须使用反斜杠。
在我的例子中,我通过构建项目创建的DLL仍然在后台使用。我杀死了应用程序然后xcopy正常工作正常。
指定的错误与post built事件有关。不知何故,VS工具无法将文件复制到目标文件夹。这可能有很多原因。要检查确切的错误原因,请转到工具>选项>项目和解决方案>构建并运行,并将“MsBuild项目构建输出详细程度”更改为“诊断”。它将为您提供足够的信息来检测实际问题。
这已经太晚了,但是为后来的人们发布了我的经验: - 在MS VS 2010中,我遇到了同样的问题。通过在构建包含空格的构建复制命令args中添加引号来解决它!
在项目属性 - >配置属性 - >构建事件 - >构建后事件 - >命令行已更改
复制$(ProjectDir)a \ b \ c $(OutputPath)
至
复制“$(ProjectDir)a \ b \ c”“$(OutputPath)”
如果在将构建完成后放入正确的项目后问题仍然存在,请尝试使用“copy”而不是xcopy。这对我有用。
导入项目的构建后事件(在“构建事件”下的“属性”对话框中)具有未定义的环境变量。
导航到Control Panel\All Control Panel Items\System\Advanced system settings
添加适当的environment variable, and doing no more比重新启动VS2017解决了错误。
此外,继@Seans和其他关于多个项目竞赛/争用的答案后,在输出文件夹中创建一个临时文件夹,如下所示,
并选择产生首选输出的项目:
和构建(没有重建/清理)是一个快速的解决方案。
我通过执行以下操作解决了这个问题:在Visual Studio中,我进入了Project - > Project Dependencies
我选择了XXX.Test解决方案并告诉它,它还依赖于XXX解决方案来使XXX.Test解决方案中的后期构建事件不生成此错误(退出代码4)。
问候,