PowerShell- cockemainwindow为所有人工作吗?
我正在寻找一种方法来优雅地关闭/退出在 GoogleDriveFS 进程下运行的 GoogleDrive 应用程序。
get-process GoogleDriveFS
Handles NPM(K) PM(K) WS(K) CPU(s) Id SI ProcessName
------- ------ ----- ----- ------ -- -- -----------
219 16 10796 5732 0.05 4392 1 GoogleDriveFS
333 22 11820 32364 0.17 8424 1 GoogleDriveFS
297 19 16528 34860 0.06 12036 1 GoogleDriveFS
245 17 10472 23992 0.03 14296 1 GoogleDriveFS
572 26 52256 82728 0.84 17788 1 GoogleDriveFS
518 21 28668 68208 0.44 18460 1 GoogleDriveFS
1024 59 47016 89396 27.95 19452 1 GoogleDriveFS
像 Process.CloseMainWindow 方法适合这个吗?或者有更好的方法来确保应用程序不运行?
I'm looking for a way to gracefully close/quit the GoogleDrive app which runs under the process GoogleDriveFS.
get-process GoogleDriveFS
Handles NPM(K) PM(K) WS(K) CPU(s) Id SI ProcessName
------- ------ ----- ----- ------ -- -- -----------
219 16 10796 5732 0.05 4392 1 GoogleDriveFS
333 22 11820 32364 0.17 8424 1 GoogleDriveFS
297 19 16528 34860 0.06 12036 1 GoogleDriveFS
245 17 10472 23992 0.03 14296 1 GoogleDriveFS
572 26 52256 82728 0.84 17788 1 GoogleDriveFS
518 21 28668 68208 0.44 18460 1 GoogleDriveFS
1024 59 47016 89396 27.95 19452 1 GoogleDriveFS
is something like Process.CloseMainWindow Method suitable for this ? or is there a better way to ensure the app isn't running?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
tl;dr
System.Diagnostics.Process.CloseMainWindow()
将不起作用,原因在底部部分解释。注意:
您可以尝试以下方法来实现优雅终止,但不能保证它会起作用:
如果不起作用t,强制终止是您唯一的选择,最容易通过以下方式完成:
注意:如下所述,
Stop-Process
< em>总是强行终止。-Force
开关的唯一功能是抑制当您尝试终止属于不同用户的进程时出现的潜在确认提示(仅适用于提升)。这是一个 < strong>首先尝试优雅终止,然后在指定的超时后回退到强制终止的片段:
在 Windows 上,优雅终止基本上只是 GUI 的一个选项 -子系统应用程序,即具有主窗口(无论是否可见)的进程,因此具有可以将
WM_CLOSE
消息发布到的消息循环。换句话说:您无法要求 Windows 上的控制台应用程序正常终止(除非它们实现了某种特定于应用程序的自定义机制,其他进程可以通过该机制请求终止)。
对于支持的应用程序,有重要注意事项:
终止无法保证,即使确实发生,其时机也无法保证:
WM_CLOSE
消息的状态,例如当时恰好正在显示模式对话框或恰好被卡住。因此,如果您需要确保终止,您必须在事后监控实际终止的流程,并可能会终止它< em>在适当的超时时间后强制。
taskkill.exe
通过其/f
选项提供强制终止。提供强制终止System.Diagnostics.Process.Kill()
Stop-Process
cmdlet总是使用此方法,即总是终止进程强制 - 允许在选择加入的基础上请求优雅终止是GitHub 问题 #13664。在 Windows API 级别,目标主窗口是否可见并不重要,因此即使是按设计运行的(GUI 子系统)进程也不可见 - as
GoogleDriveFS.exe
似乎是 - 可以用WM_CLOSE
消息。虽然
System.Diagnostics.Process.CloseMainWindow()
旨在通过发送WM_CLOSE
消息到其主窗口,不幸的是找不到该窗口如果它碰巧不可见(隐藏)(仍然适用.NET 6.0)相比之下,
taskkill.exe
实用程序没有有此限制。两种方法共有的一个限制是无法定位UWP/Microsoft Store 应用程序。
EnumWindows
WinAPI方法,仅支持桌面应用程序。FindWindowEx
并向其发布WM_CLOSE
, 是可能的。tl;dr
System.Diagnostics.Process.CloseMainWindow()
will not work, for the reasons explained in the bottom section.Note:
You can try the following to achieve graceful termination, but there's no guarantee it will work:
If it doesn't, forceful termination is your only option, which is most easily accomplished with:
Note: As discussed below,
Stop-Process
always terminates forcefully. The only function of the-Force
switch is to suppress a potential confirmation prompt that is presented when you attempt to terminate processes belonging to a different user (only works with elevation).Here's a snippet that first tries graceful termination, then falls back to forceful termination after a specifiable timeout:
On Windows, graceful termination is fundamentally only an option for GUI-subsystem applications, i.e. processes that have a main window (whether visible or not) and therefore a message loop to which the
WM_CLOSE
message can be posted.In other words: you cannot ask console applications on Windows to terminate gracefully (unless they implement some application-specific custom mechanism through which other processes can request termination).
For supported applications, there are important considerations:
Termination isn't guaranteed, and even if it does happen, its timing isn't guaranteed:
WM_CLOSE
message, such as when it happens to be displaying a modal dialog at the time or happens to be stuck.Therefore, if you need to ensure termination, you'll have to monitor the process for actual termination afterwards, and possibly terminate it forcefully after a suitable timeout period.
taskkill.exe
offers forceful termination via its/f
option.System.Diagnostics.Process.Kill()
Stop-Process
cmdlet invariably uses this method, i.e. invariably terminates processes forcefully - allowing requesting graceful termination on an opt-in basis is the subject of GitHub issue #13664.At the Windows API level, it doesn't matter if the targeted main window is visible or not, so that even (GUI-subsystem) processes that by design run invisibly - as
GoogleDriveFS.exe
appears to be - can be targeted with aWM_CLOSE
message.While
System.Diagnostics.Process.CloseMainWindow()
is designed to request graceful termination of a given process by sending aWM_CLOSE
message to its main window, it unfortunately doesn't find that window if it happens to be invisible (hidden) (still applies as of .NET 6.0)By contrast, the
taskkill.exe
utility does not have this limitation.A limitation that BOTH methods share is the inability to target processes that are UWP / Microsoft Store applications.
EnumWindows
WinAPI method, which only supports desktop applications.FindWindowEx
and postingWM_CLOSE
to it, is possible.您可以做类似的事情:
但是,这将提示用户确认关闭。
您也可以使用
CLOSE()
方法避免提示用户或kill()
立即发布所有资源。通过
You can do something like this:
However, this will prompt for the user to confirm the close.
You could also use the
close()
method to avoid prompting the user orkill()
to immediately release all resources.via https://learn.microsoft.com/en-us/dotnet/api/system.diagnostics.process?view=net-6.0#methods
您可以使用 GoogleDriveFS.exe 的
--quit
参数:但每次软件更新后它都会中断,因此运行这个 bat 文件应该会更好 :
此 bat 文件查找最新的 GoogleDriveFS.exe 并使用与脚本相同的参数运行它。
以及来自 Powershell 的:
You could use the
--quit
argument of GoogleDriveFS.exe :But it will break after each software update so running this bat file should be better :
This bat file looks up the latest GoogleDriveFS.exe and runs it with the same arguments as the script.
And from Powershell :