尝试关闭并重新打开Google Chrome -不工作

ego6inou  于 2023-09-28  发布在  Go
关注(0)|答案(1)|浏览(105)

我需要关闭,然后以全屏模式重新打开Google Chrome(通过Windows Scheduler)。
我的代码在一个PowerShell脚本文件(.ps1)中:

# Close Google Chrome
Get-Process chrome | ForEach-Object { $_.CloseMainWindow() | Out-Null }

# Wait for a few seconds to ensure Chrome is fully closed
Start-Sleep -Seconds 5

# Reopen Google Chrome in full-screen mode
Start-Process "C:\Program Files (x86)\Google\Chrome\Application\chrome.exe" -ArgumentList "--start-fullscreen"

但它并没有关闭Chrome。
你能看出代码有什么问题吗?或者是否可以添加日志以查看任何错误?
谢谢你,马克

ghg1uchk

ghg1uchk1#

  • 您的代码原则上可以工作,但是.CloseMainWindow()方法只 * 请求 * 关闭目标进程的主窗口,而不 * 强制执行 *。
  • 值得注意的是,如果出现以下情况,请求将 * 不 * 被接受:
  • Chrome窗口在关闭前会弹出一个确认对话框。
  • 某个窗口没有响应。
  • 从好的方面来说,如果请求 * 被 * 接受,您就允许进程 * 优雅地 * 关闭,从而避免了 * 潜在的数据丢失 *。
  • 如果您愿意 * 强制终止 * 所有Chrome进程-冒着潜在数据丢失的风险-您可以使用Stop-Process代替,如Compo建议:
# Forcefully terminates all Chrome processes - RISK OF DATA LOSS
Stop-Process -Name chrome

如果你想给予Chrome进程有机会先优雅地关闭,然后“回退到”强制终止,你可以将这两种方法结合起来:

# Try graceful shutdown first.
$null = 
  try { (Get-Process -ErrorAction Ignore chrome).CloseMainWindow() } catch { }

# Sleep a little, to see if the graceful shutdown succeeded.
# Note: You may have to tweak the sleep intervals.
Start-Sleep 1

# If any Chrome processes still exist, terminate them forcefully now.
if ($chromeProcesses = Get-Process -ErrorAction Ignore chrome) {
  # Terminate forcefully, and abort if that fails.
  $chromeProcesses | Stop-Process -ErrorAction Stop
  # Sleep again, to wait for the terminated processes to disappear.
  Start-Sleep 1
}

# Restart Chrome.
# Note that with Start-Process you normally do not need the full path.
Start-Process chrome '--start-fullscreen'

注意使用member-access enumeration来简化调用.CloseMainWindow()的代码:
(Get-Process -ErrorAction Ignore chrome).CloseMainWindow()Get-Process返回的 each 进程对象上自动调用.CloseMainWindow(); try/catch shell 确保如果碰巧 * 没有 * 匹配的进程,不会发生错误,因为尝试调用$null上的方法会导致错误。

相关问题