【问题标题】:Swallowing errors in pre-build steps in Visual Studio 2010在 Visual Studio 2010 的预构建步骤中吞下错误
【发布时间】:2011-08-13 23:14:32
【问题描述】:

我的解决方案有一堆项目,其中一个是 Windows 服务;我有一个停止服务的预构建步骤和一个重新启动它的构建后步骤(这样,当 VS 构建/覆盖它时,Windows 服务 exe 不会被锁定)。

on pre-build: 
net stop myservice

on post-build:
net start myservice

如果在我开始构建时服务未运行,则 net stop 命令会失败,这会阻止构建继续进行。

即使预构建步骤失败,我还能做些什么来强制构建?

【问题讨论】:

    标签: visual-studio visual-studio-2010 prebuild pre-build-event


    【解决方案1】:

    我想通了-您只需在末尾添加以下语句:

    SET ERRORLEVEL = 0
    

    或者简单地说:

    EXIT 0
    

    【讨论】:

    • 我必须删除空格才能使第一个工作:SET ERRORLEVEL=0
    【解决方案2】:

    我知道这是一篇旧帖子,但我最近也遇到了这个问题。如果我正在构建的进程当前正在运行,我想终止它,并发现我可以这样做:

    taskkill /f /im $(TargetName).exe 2>nul 1>nul
    0号出口

    2>nul 1>nul 没有Exit 0,反之亦然,似乎不起作用。我必须两者都做。

    另外值得注意的是,这是使用 Visual Studio Express 2012。

    我在调查这个问题时也找到了解决方案on this blog

    2>nul 1>nul 将从命令中吞下标准错误和标准输出。 EXIT 0 将确保构建事件返回 0。

    【讨论】:

    • 这正是我想要做的。还有一点信息:我发现批处理文件中的EXIT 0 使用CALL myscript.bat 从VS2015 构建操作调用,将导致整个操作退出而不是在myscript.bat 之后继续。但这可以通过使用 SET ERRORLEVEL = 0 来解决。
    • 或者更好的是2>nul &set errorlevel=0 这可以让你以后有额外的行。无需重定向标准输出1> nul
    • 同样适用于 VS2017
    • 在 VS2019 中也可以使用
    【解决方案3】:

    不需要重定向标准输出,只需重定向标准错误。此外,set errorlevel 允许您稍后根据需要添加额外的行。退出将立即终止。

    taskkill /f /im:$(TargetFileName) 2>nul &set errorlevel=0

    适用于 VS 2017。

    【讨论】:

      【解决方案4】:

      有点晚了,但是一个很好的解决方案,所以我还是会分享它。

      以下解决方案取自blog post

      您只需定义您的例如根据需要发布构建步骤。您不需要将它们包装到批处理文件中,但可以。然后更改项目文件(例如 vbproj 或 csproj 文件)并在项目结束标记之前插入以下片段:

      <Target
        Name="PostBuildEvent"
        Condition="'$(PostBuildEvent)'!=''"
        DependsOnTargets="$(PostBuildEventDependsOn)">
        <Exec WorkingDirectory="$(OutDir)" Command="$(PostBuildEvent)" ContinueOnError="true" />
      </Target>
      

      这会改变 Visual Studio 执行后期构建步骤的方式。 ContinueOnError 属性指示 VS 简单地忽略错误。它仍然会在构建结果中发出警告,但不会停止构建。

      您可以通过相应地更改上述片段来对 PreBuildEvent 执行相同的操作。

      当然,这仅适用于所有构建步骤。您不能仅选择性地忽略某些步骤上的错误。如果您需要这样做,您必须坚持使用批处理文件的解决方案,但上述解决方案的好处是您不需要单独的批处理。

      萨沙

      【讨论】:

        【解决方案5】:

        将您的net 命令包装在一个批处理文件中并使用exit /B 0

        http://ss64.com/nt/exit.html

        【讨论】:

          【解决方案6】:

          将命令嵌入到始终返回 0 的可执行文件中会解决您的问题吗?

          在c调用中

          system("net stop myservice")
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2012-09-24
            • 2014-05-24
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2017-02-01
            • 2012-11-04
            相关资源
            最近更新 更多