【问题标题】:Is there a gentle way of stopping processes using Windows PowerShell?是否有使用 Windows PowerShell 停止进程的温和方法?
【发布时间】:2015-11-07 04:20:41
【问题描述】:

我必须通过 PowerShell 脚本停止浏览器,我通过管道将其导入

Stop-Process -Force

但是,这非常突然。当浏览器重新启动时,它检测到它没有完全关闭,并尝试重新启动前一个会话。有什么方法可以告诉它优雅地关闭自己吗? (“我们有两种方法可以做到这一点……”)

【问题讨论】:

    标签: powershell


    【解决方案1】:

    试试这个来模拟用户关闭应用:

    (Get-Process -Id 10024).CloseMainWindow()
    

    【讨论】:

      【解决方案2】:

      Keith Hill 已经提议使用 CloseMainWindow()。但这只是关闭的邀请,可能仍需要一些用户交互,例如应用程序可能会显示一些对话框以保存某些内容等。如果调用脚本确实希望退出进程,我使用以下模式:

      # close the window and wait for exit
      $_ = Get-Process -Id 12345
      [void]$_.CloseMainWindow()
      if (!$_.HasExited) {
          Write-Host "Waiting for exit of Pid=$($_.Id)..."
          $_.WaitForExit()
      }
      

      【讨论】:

      • 我还必须将 Chrome 启动设置从“从上次中断的地方继续”更改为“打开新标签页”。这允许打开 Chrome 的进程在不打开新标签旁边的最后一个会话标签的情况下启动。
      • 重要提示。但是分配给$_ 似乎是一个非常糟糕的主意。
      【解决方案3】:

      您也可以这样做:

      Get-Process <name> | where {$_.MainWindowHandle -ne [System.IntPtr]::Zero} | foreach {$_.CloseMainWindow()}
      

      这将关闭所有与模式匹配的进程并附加一个窗口。例如,Chrome 进程可能会使用没有窗口的子进程。这些子流程将被忽略。

      【讨论】:

      • 仅供参考 - 只要实际存在具有给定名称的进程,此命令就会起作用,否则会出错。根据您的用例,可能需要也可能不需要错误。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-21
      • 2011-01-01
      • 2020-03-12
      • 2020-08-01
      相关资源
      最近更新 更多