如何将构建后事件命令行传输到MsBuild中的批处理文件?

问题描述 投票:0回答:3

在我的演示项目的构建事件(类库项目)中,要将构建结果.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%
batch-file msbuild visual-studio-2017 post-build-event
3个回答
1
投票

call是你应该使用的cmd.exe的内部命令

cmd.exe /c "$(SolutionDir)CopyPackage.bat"

代替。

编辑:

批处理文件的内容正好是上面的命令行

VS变量将无法在.bat文件中正确解析。您应该将它们作为参数传递给批处理文件。


1
投票

无需使用call,您只需直接调用批处理脚本即可。

我必须提醒你,因为后期构建目标无法知道任务的输入和输出,所以即使没有任何改变,也总是必须执行脚本。

相反,如果将其转换为msbuild目标并正确实现输入/输出信令,则可以通过利用MsBuild的增量构建功能获得大量时间。

例如:

<Target Name="CopyOutputs"
    Inputs="@(BuiltAssemblies)"
    Outputs="@(BuiltAssemblies -> '$(OutputPath)%(Filename)%(Extension)')">

    <Copy
        SourceFiles="@(BuiltAssemblies)"
        DestinationFolder="$(OutputPath)"/>

</Target>

可以找到有关增量构建和输入/输出信令的更多信息:


1
投票

将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识别),因此构建将无法找到路径。

© www.soinside.com 2019 - 2024. All rights reserved.