如何在窗口不闪烁的情况下运行批处理脚本?

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

使用上一个问题的建议(当同名进程打开时超时后终止进程 - 批处理)我能够在超时后终止同名进程:

popd
pushd mypath
for /f %%i in ('powershell "(Start-Process myapp.exe -passthru).ID"') do (
timeout /t 180
taskkill /PID %%i
)

但是,我想在不显示(和闪烁)窗口的情况下启动该过程。 我发现了很多问题,例如:如何在不显示窗口的情况下运行 PowerShell 脚本?但我无法将它们合并到我的脚本中。我怎样才能做到这一点?

谢谢您的帮助

powershell batch-file
2个回答
2
投票

按照史蒂文的评论,我也在循环内添加了

-WindowStyle Hidden
。解决方案在这里:

pushd mypath
for /f %%i in ('powershell -WindowStyle Hidden -"(Start-Process myapp.exe -passthru -WindowStyle Hidden).ID"') do (
timeout /t 180
taskkill /PID %%i
)

2
投票

tl;博士

要隐藏通过使用控制台应用程序(在您的情况下为Start-Process

)使用
myapp.exe
而产生的控制台窗口,请使用
-WindowStyle Hidden
,如答案中所示,但您也可以简化并通过在单个 powershell.exe 调用中执行 all
 操作来缩短代码:

@echo off powershell.exe -c "if (-not ($ps = Start-Process -WindowStyle Hidden myapp.exe -PassThru).WaitForExit(60000)) { Stop-Process $ps }"


用例:

  • 您想要的是

    隐藏默认情况下由PowerShell的Start-Process

    启动控制台应用程序产生的控制台窗口(通常不会这样做,因为直接同步执行到目前为止是最常见的用例 - 请参阅这个答案):
    

    • -WindowStyle Hidden

      隐藏这个新窗口;请注意,您将无法查看或捕获任何输出,除非您通过  请求重定向到 files
      
      -RedirectStandardOutput
      -RedirectStandardError
       参数;另外,为了检查
      退出代码,您需要使用-PassThru
      来获取代表新启动进程的对象。

    • 如果您想在

      current控制台窗口中查看程序的输出 - 尽管无法捕获它 - 请使用-NoNewWindow

      ,但是,只有当您也使用-Wait
      时才有意义,否则,异步运行的程序的输出将干扰您的显示(如果您无论如何都在等待,直接同步调用是更好的选择)。

    • 顺便说一句:在类 Unix 平台上,不支持

      -WindowStyle

      ,并且 
      -NoNewWindow
      implied,这使得 Start-Process
       仅适用于在 Unix 上启动 
      GUI 程序(包括在命令在默认网络浏览器中打开它们;例如 Start-Process http://example.org
      )

  • 但是,您的问题标题可能会让人们认为您的意图是

    运行批处理文件本身 - 或任何控制台应用程序 - 不可见

    • Windows 目前为此提供没有直接机制;启动控制台应用程序总是会为其创建一个“可见”控制台。因此,解决方案需要一个 GUI 子系统 帮助程序文件或机制,(a) 本身不会创建控制台窗口,并且 (b) 允许在启动目标控制台应用程序时隐藏自动控制台窗口(但是,正在讨论潜在的未来增强,控制台的条件分配,这将允许应用程序根据运行时条件决定是否分配控制台,但请注意,只有设计为使用此功能的应用程序才会提供情境不分配-控制台启动)。

      目前有几种
    • 解决方案
      • 通过
      • mshta.exe:

        致电;一个简单的例子,它以不可见的方式运行

        powershell.exe
        本身并最终打开记事本;您可以从 Windows Run
         对话框 (
        Win-R
        ) 运行它,以验证没有为 PowerShell 创建控制台窗口:
        mshta.exe vbscript:(CreateObject("WScript.Shell").Run("powershell -c notepad.exe",0))(Window.Close)

          警告
        • :AV 软件可能会阻止此调用机制。
        使用通过 GUI 子系统
      • *.vbs
      • 主机启动的

        辅助 WSH 脚本*.js

        wscript.exe
        ) - 请参阅
        此答案

        使用
      • 第三方
      • RunHiddenConsole

        项目,它提供了一个通用GUI子系统帮助程序可执行文件,您可以为目标可执行文件命名并附加w

        使用
      • Python
      • 请参阅

        此答案
      • PowerShell
      • 的上下文中,具体来说:

        使用第三方
        • PS2EXE-GUI

          脚本可以为您创建的 PowerShell 脚本的 GUI 子系统 包装可执行文件;请参阅这个答案作为示例。

          注意
            :包装器生成脚本必须在
          • Windows PowerShell 中运行,生成的 *.exe 也通过 Windows PowerShell SDK 执行。
            
            
        • PowerShell(核心) CLIpwsh.exe本身可能会在未来

          提供解决方案,如GitHub问题#3028中所讨论,基于先前链接的计划系统级增强,条件控制台分配)。
          
          
          

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