根据此线,似乎该解决方案不再起作用版本 1909。
当我在文件资源管理器中打开一个文件夹C:\
并运行 cmd 命令时tasklist /V /FI "IMAGENAME eq explorer.exe"
,我得到NA
窗口标题列下的内容。
如果我尝试,taskkill /FI "IMAGENAME eq explorer.exe" /FI "WINDOWTITLE eq C:\"
它不会关闭C:\
打开文件夹的文件资源管理器。
还有其他人也遇到这个问题吗?
对于我构建的 Windows,相关线程不再起作用:
答案1
TL:DR 据我所知,由于微软在最新的 Windows 10 版本中进行了重新设计,这根本不再可能实现。
长话短说:
在我看来,为了启用选项卡式/停靠式窗口(每个选项卡都包含不同 Explorer 子进程的信息),Microsoft 必须将窗口/显示部分从实际的 Explorer 进程中分离出来,现在似乎有一个处理所有窗口/选项卡的进程,而实际的 FileExplorer 进程则通过将其输出发送到该窗口管理器进程来显示它们。
更复杂的是,您无法从批处理文件中判断用户是决定将窗口保留为独立窗口还是将其作为选项卡停靠到另一个窗口。从
技术上讲,选项卡是一种不同类型的显示元素,具有不同的关闭方法。
当然,终止窗口管理器进程仍会关闭窗口/选项卡,但会拖累与其相关的所有其他内容。
我实际上尝试了几次,结果很“有趣”:
根据当时打开的其他软件,Explorer.exe 要么崩溃,必须重新启动(使用 Ctrl-Alt-Del 调出任务管理器,然后使用运行菜单重新启动 Exporer.exe)。
或者 Explorer.exe 挂起得非常厉害,什么都不起作用了,我不得不关闭电脑。
现在看来,唯一正确的方法是编写一个软件,遍历所有打开的窗口和选项卡,以识别与文件夹关联的窗口和选项卡(可能必须根据窗口或选项卡标题进行),找到后,它会将 Windows-Close 或 Tab-Close 事件发送到该窗口或选项卡。
而且,这很可能只有当该程序也以提升的权限(管理员权限)运行时才能完成,因为它需要在系统结构中进行探索,而这些系统结构很可能需要比普通用户通常拥有的更高的权限级别。
答案2
如果您对其他平台开放,AutoHotkey 通常允许一个人运行一个程序并捕获其启动的程序的 PID。
查找 PPID(父级 PID)也可能对你有帮助。例如,从 CMD.exe:
WMIC /APPEND:output.txt PROCESS WHERE "Caption='explorer.exe'" GET Caption,CommandLine,Description,ExecutablePath,Name,ParentProcessId,ProcessId /FORMAT:LIST
(/APPEND output.txt
是可选的。如果不需要,请删除。此外,GET
如果冗余太多,请删除之后的一些项目。或者删除GET
和之间的所有内容/FORMAT
以显示更多信息。)
请注意,如果您使用 PowerShell,这些逗号可能会有问题,因此请在每个逗号前放置一个反引号/反引号(未移动的波浪号,位于制表符上方和 1 的左侧),以便 PowerShell 不会将逗号解释为其自己的用途。
WMIC PROCESS WHERE "Caption='explorer.exe'" GET Caption,CommandLine,Description,ExecutablePath,Name,ParentProcessId,ProcessId /FORMAT:LIST
如果您能以某种方式跟踪 ParentProcess ID 以匹配您用于运行 Explorer.exe 的程序,我怀疑这可能是关闭正确窗口的一种非常具体的方法(甚至比根据标题栏进行猜测更合适/更安全)。但是,现在我无法为您提供有关如何执行此操作的完整描述,因为我没有足够的详细信息来设置。(而且,即使有更多细节,我也可能无法完全为您解决这个问题,所以我只是希望这些指针对您有用。)
答案3
我没有你的版本,但是你的技术很不稳定。
这.vbs
有用吗?
Set objShell = CreateObject("Shell.Application")
Set AllWindows = objShell.Windows
For Each window in AllWindows
If window.locationname = "C:\" then
window.Close
End If
Next