在我的演示项目的构建事件(类库项目)中,要将构建结果.dll
复制到特定文件夹(如果它不存在则自动创建),我在Post-build event
命令行部分中添加了以下命令行:
xcopy /Y "$(TargetDir)$(TargetFileName)" "$(SolutionDir)DemoApp\bin\$(ConfigurationName)\Packages\"
它完美地运作。
然后我尝试通过调用位于$(SolutionDir)中名为CopyPackage.bat的新批处理文件来替换该命令行。批处理文件的内容正好是上面的命令行:
call $(SolutionDir)CopyPackage.bat
然后我重建项目并得到以下错误:
严重级代码说明项目文件行抑制状态错误命令“call C:\ TestProjects \ DemoApp \ CopyPackage.bat”退出,代码为4. DemoApp
我错过了什么吗?
从大家那里得到一些提示之后的解决方案:
在post-build event命令行中我把:(参见参数)
$(SolutionDir)CopyPackage.bat“$(TargetDir)$(TargetFileName)”“$(SolutionDir)DemoApp \ bin \ $(ConfigurationName)\ Packages \”
在批处理文件CopyPackage.bat中:
set targetfile=%~1
set targetdir=%~2
echo %targetfile%
echo %targetdir%
xcopy /Y %targetfile% %targetdir%
call
是你应该使用的cmd.exe
的内部命令
cmd.exe /c "$(SolutionDir)CopyPackage.bat"
代替。
编辑:
批处理文件的内容正好是上面的命令行
VS变量将无法在.bat文件中正确解析。您应该将它们作为参数传递给批处理文件。
无需使用call
,您只需直接调用批处理脚本即可。
我必须提醒你,因为后期构建目标无法知道任务的输入和输出,所以即使没有任何改变,也总是必须执行脚本。
相反,如果将其转换为msbuild目标并正确实现输入/输出信令,则可以通过利用MsBuild的增量构建功能获得大量时间。
例如:
<Target Name="CopyOutputs"
Inputs="@(BuiltAssemblies)"
Outputs="@(BuiltAssemblies -> '$(OutputPath)%(Filename)%(Extension)')">
<Copy
SourceFiles="@(BuiltAssemblies)"
DestinationFolder="$(OutputPath)"/>
</Target>
可以找到有关增量构建和输入/输出信令的更多信息:
将CopyPackage.bat中的路径更改为绝对路径可以帮助解决此问题。
像这样的属性:$(TargetDir),$(SolutionDir)被msbuild.exe工具识别,因为它们是msbuild属性的一部分,并被定义或导入到当前环境中。
在构建后事件中使用xcopy /Y "$(TargetDir)$(TargetFileName)" "$(SolutionDir)DemoApp\bin\$(ConfigurationName)\Packages\"
时,msbuild工具可以识别它们。这是第一次成功。
但是,这是第二次。 msbuild引擎可以识别post-build-event中的属性,因此它成功调用.bat。但由于.bat无法识别Msbuild属性(这些属性只能被MSbuild.exe识别,而不能被.bat或cmd.exe识别),因此构建将无法找到路径。