如何将 post-build 事件命令行传输到 MsBuild 中的批处理文件?

How to transfer post-build event command line to batch file in MsBuild?

在我的演示项目的构建事件中,(一个 class 库项目),将构建结果 .dll 复制到特定文件夹,(如果不存在则自动创建),我在 Post-build event 命令行部分添加了以下命令行:

xcopy /Y "$(TargetDir)$(TargetFileName)" "$(SolutionDir)DemoApp\bin$(ConfigurationName)\Packages\"

它完美运行。

然后我尝试用对位于 $(SolutionDir) 中名为 CopyPackage.bat 的新批处理文件的调用替换该命令行。批处理文件的内容正是上面的命令行:

call $(SolutionDir)CopyPackage.bat

然后我重建项目并得到以下错误:

Severity Code Description Project File Line Suppression State Error The command "call C:\TestProjects\DemoApp\CopyPackage.bat" exited with code 4. DemoApp

我错过了什么吗?


解决方案 在得到大家的一些提示后:

post-构建事件命令行中我输入:(查看参数)

$(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%

callcmd.exe 的内部命令,你应该使用

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

相反。

编辑:

The content of the batch file is exactly the command line above

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

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

我不得不提醒你,因为 post-build 目标无法知道任务的输入和输出,它总是必须执行脚本,即使没有任何改变。

相反,如果您将其转换为 msbuild 目标并正确实施 input/output 信号,您将通过利用 MsBuild 的增量构建功能获得大量时间。

例如:

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

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

</Target>

可以找到有关增量构建和 input/output 信号的更多信息:

Changing the path in your CopyPackage.bat to absolute path can help resolve this.

像这样的属性:$(TargetDir)、$(SolutionDir) 被 msbuild.exe 工具识别,因为它们是 msbuild 属性的一部分并且被定义或导入到当前环境中。

在post-build-event中使用xcopy /Y "$(TargetDir)$(TargetFileName)" "$(SolutionDir)DemoApp\bin$(ConfigurationName)\Packages\"时,msbuild工具第一次可以识别them.So,成功。

不过,第二次了。 msbuild 引擎可以识别 post-build-event 中的属性,因此它成功调用了 .bat。但是由于.bat无法识别Msbuild 属性(这些属性只能被MSbuild.exe识别,不能被.bat或cmd.exe识别),构建会因为找不到路径而失败.