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


13

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

taskkill /f /im explorer.exe
explorer.exe

当然,这会杀死所有 explorer.exe进程,包括我打开的explorer窗口。(显然,我正在使用的选项Launch folder windows in a separate process。)

我有什么方法可以确定explorer.exe的哪个实例是主要实例,然后杀死它?


杀死主explorer.exe可能只会杀死所有其他explorer.exe,因为它们依赖于它来运行。
cutrightjm 2012年

1
@ekaj不是。我可以手动完成。每个窗口都是一个独立的过程。
霍德-莫妮卡的军队

我也想找到一种可靠的方法来确定主explorer.exe实例(与桌面相关联),但是出于相反的原因。我感到烦人的是,explorer.exe当关闭所有与它们相关的窗口时,生成的进程并不总是退出。我使用任务管理器杀死它们,并倾向于依靠这样一个事实,即生成的实例通常被设置为高优先级(出于某种原因)。这可以正常工作,但是如果我碰巧将其设置为正常(出于明显的原因),那么冒着意外杀死主进程的风险。
Synetech 2012年

@Synetech的解决方案是taskkill /f /im explorer.exe /fi "windowtitle ne N/A"。出于某种原因,将其复制/粘贴到cmd提示符下是行不通的;您必须手动输入。没有尝试批处理文件。
霍德-莫妮卡的军队

1
您已将问题分为容易和不可能的部分,已解决了容易部分,现在正在寻求有关不可能部分的帮助。解决方案的“简单”部分很可能是不正确的(例如,您可以通过组策略来实现此目的),因此如果您的问题中包含要解决的原始问题,那将是很好的选择。杀死不属于您的进程很少是正确的。
西蒙·里希特

Answers:


9

基于窗口标题的方法

@ techie007建议杀死explorer.exewith窗口标题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个字符(内存使用开始)开始对先前的输出进行排序。

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

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


谢谢!但是由于某种原因,这对我来说还行不通。我正在努力查看是否可以对其进行某种修改以使其正常工作。
霍德-莫妮卡的军队

1
@Dennis, >将explorerpid设置为具有最高内存使用率的explorer.exe的PID。那应该是确定主要过程的最可靠方法。 不,不正确。打开一个新的窗口过程(例如,通过快捷方式),并导航到包含大量图片的文件夹,并以缩略图模式查看它们。新过程将在内存使用方面迅速超过原始过程。 >嗯,您没有提到您没有使用默认配置。 问题是如何确定哪个“ explorer.exe”进程是主要进程?您还怎么认为这可能是个问题?
Synetech 2012年

窗口方法和内存方法现在都可以使用。我想我会选择开窗-似乎更可靠。非常感谢!
霍德-莫妮卡的军队

3

也许您可以告诉资源管理器在标题栏中显示路径,然后根据该条件使用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等,但它应该为您提供一个良好的起点。


我要杀死的过程是主要过程。tasklist /fi "imagename eq explorer.exe" /v /fo list告诉我它的窗口标题是“ N / A”。不幸的是,““ windowtitle eq N / A”不起作用。有任何想法吗?
霍德-莫妮卡的军队

啊。知道了。我在StackOverflow上找到了答案,我将在此处通过链接用相关的位来更新答案。
Ƭᴇcʜιᴇ007

我仍然看不到这将如何工作。如果桌面以外没有打开的资源管理器窗口怎么办?
Synetech 2012年

1

用最低的PID(进程ID)终止进程。它会先启动,因为进程会按顺序编号。


+1这将在第一次运行批处理文件时起作用,但由于重新启动了explorer.exe,因此新的“主”进程将具有更高的PID。还有另一种方法吗?
霍德-莫妮卡的军队

这是真的。但是,您可以只输出tasklist | find /f "explorer"并询问,然后(通过用户输入)询问要杀死的最低PID是多少。
Mythrillic 2012年

@HodofHod:最可靠的方法是选择内存使用率最高的进程。如果您可以使用MinGW(sedawk等),则可以很容易地自动完成。如果不是,则用户输入可能是最佳选择。
丹尼斯

@ Adam543i,>使用最低的PID(进程ID)杀死该进程。它会先启动,因为进程会按顺序编号。 您正在谈论什么版本的Windows?这根本是不正确的。除了随机PID安全功能外,我还记得OldNewThing上关于以间隔(四个或16个或某些)分配PID的信息。事实是,使用PID(甚至是相对的PID)太不可靠了。
Synetech 2012年

@Dennis,>最可靠的方法是选择内存使用率最高的进程。 不。一点也不。生成的进程具有更高的内存使用率是非常容易的。
Synetech 2012年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.