我有一个批处理文件,可以更改一些注册表文件,然后重新启动 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=2
COMMAND
由于
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)最小的进程。由于进程是按顺序编号的,因此它将最先启动。