有没有一种使用 Windows PowerShell 停止进程的温和方法?

Is there a gentle way of stopping processes using Windows PowerShell?

提问人:Charles Anderson 提问时间:4/28/2010 更新时间:11/7/2015 访问量:6272

问:

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

Stop-Process -Force

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

PowerShell

评论


答:

16赞 Keith Hill 4/28/2010 #1

尝试以下操作来模拟用户关闭应用:

(Get-Process -Id 10024).CloseMainWindow()
11赞 Roman Kuzmin 4/28/2010 #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()
}

评论

0赞 DBADon 4/13/2019
我还必须将我的 Chrome 启动设置从“从上次中断的地方继续”更改为“打开新标签页”。这允许打开 Chrome 的进程启动,而无需打开新选项卡旁边的最后一个会话选项卡。
0赞 TNT 6/2/2019
重要提示。但是分配给似乎是一个非常糟糕的主意。$_
3赞 Vakhtang Tevdorashvili 11/7/2015 #3

您也可以执行此操作:

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

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

评论

0赞 HairOfTheDog 7/23/2016
仅供参考 - 只要确实存在具有给定名称的进程,此命令就确实有效,否则它会出错。根据您的用例,可能需要也可能不需要该错误。