我如何知道哪个“explorer.exe”进程是主进程?

我如何知道哪个“explorer.exe”进程是主进程?

我有一个批处理文件,可以更改一些注册表文件,然后重新启动 explorer.exe 以使它们生效。我使用以下命令

taskkill /f /im explorer.exe
explorer.exe

这当然会杀死全部explorer.exe 进程,包括我打开的资源管理器窗口。(显然,我使用选项Launch folder windows in a separate process

有什么方法可以确定哪个 explorer.exe 实例是主实例,然后直接终止它?

答案1

基于窗口标题的方法

@techie007 建议杀死explorer.exe带有窗口标题的N/A

命令

for /f "tokens=2,10" %%p in ('tasklist /nh /v /fi "imagename eq explorer.exe"') do if "%%q"=="N/A" taskkill /f /pid %%p

怎么运行的

  • tasklist /nh /v /fi "imagename eq explorer.exe"详细列出具有图像名称的所有进程explorer.exe

  • for /f "tokens=2,10" %%p in ('COMMAND1') do COMMAND2

    执行COMMAND1。对于每一行输出,它将变量%%p和设置%%q为第二个和第十个“标记”(以空格分隔)并执行COMMAND2

    在 的情况下taskkill /v%%p 现在保存 PID 和%%q窗口标题(的开头)。

  • if "%%q"=="N/A" taskkill /f /pid %%p检查窗口标题是否是N/A

    如果是,它将以 终止该进程taskkill

基于内存使用量的方法

@Syntech 指出对于 Windows 资源管理器来说,这是不可靠的,但在程序中,主进程的内存使用率始终最高。

命令

for /f "tokens=2" %%p in ('tasklist /nh /fi "imagename eq explorer.exe" ^| sort /+65') do @set explorerpid=%%p
taskkill /f /pid %explorerpid%

怎么运行的

  • tasklist /nh /fi "imagename eq explorer.exe"列出所有具有图像名称的进程explorer.exe

  • sort /+65从第 65 个字符(mem 使用开始的地方)开始对先前的输出进行排序。

  • for /f "tokens=2" %%p in ('COMMAND') do @set explorerpid=%%p设置为输出的每一行的explorerpid第二个( )输入(以空格分隔) ,即相应的 PID。tokens=2COMMAND

  • 由于tasklist的输出已经排序,explorerpid因此保留所声明的 PID,并taskkill终止该过程。

答案2

也许您可以告诉 Explorer 在标题栏中显示路径,然后使用WINDOWTITLE过滤器据此将其杀死?

  • 打开资源管理器
  • Alt
  • 点击“工具(菜单项)”
  • 点击“文件夹选项...(菜单项)”
  • 点击“文件夹选项”中的“查看(页面选项卡)”
  • 在“文件夹选项”中点击选择“在标题栏中显示完整路径(仅限经典主题)”
  • 点击“应用”->“确定”

使用“非经典”主题时,路径不会显示在资源管理器的标题栏中,但它(现在)在那里;只是不可见。

taskkill /F /FI "WINDOWTITLE eq C:\PathToThing\RunningInExplorer\ToRestart*"

您可能需要暂时切换到经典主题来确定要重新启动的 Explorer 实例的路径/标题。

虽然不是 100% 万无一失,但任何标题中没有该(部分)路径的资源管理器窗口至少都是安全的。:)

编辑:

由于您想要获取标题为“N/A”的那个,您可能必须使用批处理文件,以便您可以标记 TASKLIST 的结果,然后使用这些标记结果使用 TASKKIL 通过 PID 杀死。

我在 StackOverflow.com 上找到了解决此问题的答案:

来自问题Taskkill 一个无标题的进程?这个答案其中包括此示例批处理文件:

@echo off
SETLOCAL enabledelayedexpansion
for /f "tokens=*" %%a in ('TASKLIST /V') do (
  set s=%%a
  set p=!s:~27,5!
  set t=!s:~152,3!
  if '!t!'=='N/A' ECHO TASKKILL /PID !p! /T
)

您可能需要将“TASKLIST /V”命令更改为更具体地针对Explorer.exe等,但它应该为您提供一个良好的起点。

答案3

终止 PID(进程 ID)最小的进程。由于进程是按顺序编号的,因此它将最先启动。

相关内容