【问题标题】:How to transfer post-build event command line to batch file in MsBuild?如何将构建后事件命令行传输到 MsBuild 中的批处理文件?
【发布时间】:2019-08-04 01:36:40
【问题描述】:

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

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

效果很好。

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

call $(SolutionDir)CopyPackage.bat

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

严重性代码描述项目文件行抑制状态 错误 The command "call C:\TestProjects\DemoApp\CopyPackage.bat" exited with code 4. DemoApp

我错过了什么吗?


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

构建后事件命令行中我输入:(参见参数)

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


    【解决方案1】:

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

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

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

    例如:

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

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

    【讨论】:

    【解决方案2】:

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

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

    改为。

    编辑:

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

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

    【讨论】:

    • 或者干脆"$(SolutionDir)CopyPackage.bat"
    • 我认为真正的答案在你答案的最后一行。该问题的脚本可能会失败,因为他在bat 文件中使用了msbuild 变量
    • @Baruch 我相信明确调用cmd.exe 将消除任何歧义。
    • 将参数传递给批处理文件是我演示的正确方法。对于现实世界的操作,最好使用真正的构建引擎脚本来管理所有替换等。
    • @MagB 当然,构建后文件复制的解决方案不止一种,我的解决方案是关于您的具体情况。
    【解决方案3】:

    将 CopyPackage.bat 中的路径更改为绝对路径有助于解决此问题。

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

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

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

    【讨论】:

    • 用硬编码路径替换变量是最糟糕的解决方案。
    • @montonero 是的,但是您想知道的是“我错过了什么吗?”,我只想告诉您,.bat 文件的问题结果无法识别 msbuild 属性.如果您想要一种简单的方法来执行此操作,则将原始命令保留在 post-build-event 中可能会更好。
    • 您的解决方案是(非常)糟糕的做法。无论多么容易。项目文件夹的简单传输会破坏它。
    猜你喜欢
    • 2013-07-23
    • 1970-01-01
    • 2017-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-28
    • 1970-01-01
    相关资源
    最近更新 更多