【问题标题】:Closing All Explorer Windows in PowerShell在 PowerShell 中关闭所有资源管理器窗口
【发布时间】:2013-07-19 19:41:47
【问题描述】:

我正在编写以下代码以使用 PowerShell 关闭所有资源管理器窗口:

(New-Object -comObject Shell.Application).Windows() |
 ? { $_.FullName -ne $null} |
 ? { $_.FullName.toLower().Endswith('\explorer.exe') } | % { $_.Quit() }

但它不会关闭所有打开的窗口。 相反,它只关闭RoundDown(N/2)+1 窗口,而使RoundUp(N/2)-1 窗口保持打开状态。

有人可以帮忙吗?

【问题讨论】:

    标签: powershell powershell-2.0 explorer


    【解决方案1】:

    我认为管道中出现了问题。 此代码有效:

    $a = (New-Object -comObject Shell.Application).Windows() |
     ? { $_.FullName -ne $null} |
     ? { $_.FullName.toLower().Endswith('\explorer.exe') } 
    
     $a | % {  $_.Quit() }
    

    【讨论】:

    • 在浏览其内容时修改集合的经典问题。通过杀死 explorer.exe 实例,Windows 会在您仍在运行时更新集合。这通常会导致坏事。 :-) 一种常见的解决方法是反向遍历集合,但您提出的解决方案也可以正常工作。
    • 为了澄清,您总是需要小心使用循环从数组中删除项目,因为当您删除项目 [0] 时,项目 [1] 移动到 [0]。然后循环移动到下一个数字,因为它没有意识到数组已经重新排列。此解决方案拍摄进程的快照,因此当一个进程被杀死时,它不会从循环正在处理的数组中删除。
    • 自从我尝试这个时,Windows 1909 版本发生了一些变化。不过我似乎无法修复它。
    【解决方案2】:
    Stop-Process -Name explorer
    

    杀死所有相关进程

    【讨论】:

      【解决方案3】:

      根据@ste 的评论,the accepted answer 可能在 Windows 更新后停止工作。

      我已经在 Powershell 中用类似的东西解决了这个问题。

      注意,因为我假设任何带有窗口标题的资源管理器进程都是文件夹。 这可能并非总是如此(例如,如果复制文件)

      get-process | ?{ $_.ProcessName -eq 'Explorer' } | ?{ "" -ne $_.MainWindowTitle } | Stop-Process
      

      【讨论】:

        猜你喜欢
        • 2020-01-26
        • 1970-01-01
        • 2017-01-28
        • 1970-01-01
        • 1970-01-01
        • 2021-12-17
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多