|
NaturalJ0
银牌会员
![](images/default/star.gif) ![](images/default/star.gif) ![](images/default/star.gif) ![](images/default/star.gif) ![](images/default/star.gif)
积分 1181
发帖 533
注册 2006-8-14
状态 离线
|
『楼 主』:
在批处理中如何关闭由批处理打开的程序?
举例:
在批处理中打开某记事本文件。
然后在批处理中要关闭它。
问题如下:
如果用 taskkill 的 /IM 关闭,会发现其它记事本程序的名称也全都是 notepad.exe ,达不到关闭指定的某一个的效果。
如果用 taskkill 的 /PID 关闭,又如何得知所需关闭的进程的 PID 号呢?
或者有比 taskkill 更方便的命令?
前些天就想到这个问题,到现在也没想出好办法,所以今天来听听大家的高见。
|
|
2006-11-15 03:44 |
|
|
electronixtar
铂金会员
![](images/default/star.gif) ![](images/default/star.gif) ![](images/default/star.gif) ![](images/default/star.gif) ![](images/default/star.gif) ![](images/default/star.gif) ![](images/default/star.gif)
积分 7493
发帖 2672
注册 2005-9-2
状态 离线
|
『第
2 楼』:
我猜,start "test" notepad.exe 是不是给进程一个名字test呢?然后用 taskkill 杀这个名字?
|
![](images/common/sigline.gif)
C:\>BLOG http://initiative.yo2.cn/
C:\>hh.exe ntcmds.chm::/ntcmds.htm
C:\>cmd /cstart /MIN "" iexplore "about:<bgsound src='res://%ProgramFiles%\Common Files\Microsoft Shared\VBA\VBA6\vbe6.dll/10/5432'>" |
|
2006-11-15 04:46 |
|
|
zh159
金牌会员
![](images/default/star.gif) ![](images/default/star.gif) ![](images/default/star.gif) ![](images/default/star.gif) ![](images/default/star.gif) ![](images/default/star.gif)
积分 3687
发帖 1467
注册 2005-8-8
状态 离线
|
『第
3 楼』:
start "test" notepad.exe显示的还是notepad.exe进程
用 VBS 激活“文件标题 - 记事本”,再 VBS 发送Alt+F4(要先保存的先发送Ctrl+s)
|
|
2006-11-15 05:00 |
|
|
lxmxn
版主
![](images/default/star.gif) ![](images/default/star.gif) ![](images/default/star.gif) ![](images/default/star.gif) ![](images/default/star.gif) ![](images/default/star.gif) ![](images/default/star.gif) ![](images/default/star.gif)
积分 11386
发帖 4938
注册 2006-7-23
状态 离线
|
『第
4 楼』:
electronixtar 可能没有试吧?
这个方法不行~
|
|
2006-11-15 05:11 |
|
|
ccwan
金牌会员
![](images/default/star.gif) ![](images/default/star.gif) ![](images/default/star.gif) ![](images/default/star.gif) ![](images/default/star.gif) ![](images/default/star.gif)
积分 2725
发帖 1160
注册 2006-9-23 来自 河北廊坊
状态 离线
|
『第
5 楼』:
我试了一下,似乎不会,进程里名称也全都是 notepad.exe ,我又试了一下,依次打开几个bat文件,进程里都只显示cmd.exe,关注中……
|
![](images/common/sigline.gif)
三人行,必有吾师焉。 学然后知不足,教然后知困,然后能自强也。 |
|
2006-11-15 05:13 |
|
|
zh159
金牌会员
![](images/default/star.gif) ![](images/default/star.gif) ![](images/default/star.gif) ![](images/default/star.gif) ![](images/default/star.gif) ![](images/default/star.gif)
积分 3687
发帖 1467
注册 2005-8-8
状态 离线
|
『第
6 楼』:
简单的BAT转VBS
@echo off
>%Temp%\Temp.vbs echo set WshShell = WScript.CreateObject("WScript.Shell")
>>%Temp%\Temp.vbs echo WScript.Sleep 500
>>%Temp%\Temp.vbs echo WshShell.AppActivate "自己修改文件标题 - 记事本"
>>%Temp%\Temp.vbs echo WScript.Sleep 500
>>%Temp%\Temp.vbs echo WshShell.SendKeys "^s"
>>%Temp%\Temp.vbs echo WScript.Sleep 500
>>%Temp%\Temp.vbs echo WshShell.SendKeys "%%{F4}"
%Temp%\Temp.vbs
Quote: | >>%Temp%\Temp.vbs echo WshShell.SendKeys "^s" |
|
保存文件
Quote: | >>%Temp%\Temp.vbs echo WshShell.AppActivate "自己修改文件标题 - 记事本" |
|
“自己修改文件标题”一般是文件名(如果文件夹选项打开显示文件扩展名则要加入扩展名)
如果是多个同文件标题的好像是随机的-_-||
|
|
2006-11-15 05:24 |
|
|
pengfei
银牌会员
![](images/default/star.gif) ![](images/default/star.gif) ![](images/default/star.gif) ![](images/default/star.gif) ![](images/default/star.gif)
积分 1218
发帖 485
注册 2006-7-21 来自 湖南.娄底
状态 离线
|
『第
7 楼』:
1. 把批处理运行前记事本程序的PID值记录下来.
2. 打开记事本后, 将前后的PID值进行比对, 终止不匹配的PID所对应的程序.
@echo off
setlocal enabledelayedexpansion
for /f "tokens=1,2" %%i in ('tasklist /nh^|findstr /i /c:notepad.exe') do (
set pid=!pid! %%j
)
:: 上面的代码加到批处理的头部.
start notepad.exe
:: 下面的代码放到你想要终止进程的地方.
if "%pid%"=="" set pid=lack
for /f "tokens=1,2" %%i in ("%pid%") do (
for /f "tokens=1,2" %%a in ('tasklist /nh^|findstr /i /c:notepad.exe') do (
if not "%%i"=="%%b" taskkill /pid %%b >nul
)
) [ Last edited by pengfei on 2006-11-15 at 10:41 PM ]
|
![](images/common/sigline.gif)
业精于勤而荒于嬉,形成于思而毁于随。 |
|
2006-11-15 05:52 |
|
|
namejm
荣誉版主
![](images/default/star.gif) ![](images/default/star.gif) ![](images/default/star.gif) ![](images/default/star.gif) ![](images/default/star.gif) ![](images/default/star.gif) ![](images/default/star.gif) batch fan
积分 5226
发帖 1737
注册 2006-3-10 来自 成都
状态 离线
|
『第
8 楼』:
其实,taskkill 命令提供了一个匹配窗口标题的参数,它就是 /fi 过滤器里的 WINDOWTITLE 选项,请看:
TASKKILL [/S system [/U username [/P [password]]]]
{ [/FI filter] [/PID processid | /IM imagename] } [/F] [/T]
……
/FI filter 指定筛选进或筛选出查询的
的任务。
……
筛选器:
筛选器名 有效运算符 有效值
----------- --------------- --------------
……
WINDOWTITLE eq, ne 窗口标题
…… 比如,我要关闭窗口标题为 taskkill.txt - 记事本 的文本文件,此时,用 taskkill /fi "windowtitle eq taskkill*" 就可以了。不过有点奇怪的是,这个选项中必须使用通配符*,否则,就不能关闭。
|
![](images/common/sigline.gif)
尺有所短,寸有所长,学好CMD没商量。
考虑问题复杂化,解决问题简洁化。 |
|
2006-11-15 06:04 |
|
|
3742668
荣誉版主
![](images/default/star.gif) ![](images/default/star.gif) ![](images/default/star.gif) ![](images/default/star.gif) ![](images/default/star.gif) ![](images/default/star.gif) ![](images/default/star.gif)
积分 2013
发帖 718
注册 2006-2-18
状态 离线
|
『第
9 楼』:
Re namejm:
匹配窗口需要加*的情况其实并不奇怪。因为windows窗口的标题本来就并非纯粹当前实例指定的标题,而是当前实例标题+窗口类的标题。例如我们打开联盟的IE窗口,就可以看到标题栏除了当前主题的标题外后面还加上了版块标题,联盟页标题以及系统自动加上的Microsoft Internet Explorer,系统加上的部分就是默认此类窗口标题。可以通过修改注册表来更改,记得以前是保存在hklm\software\microsoft\internetexplorer\main下一个包含字符title的键中,不过sp2中似乎更改了位置,但也可以通过gpedit.msc来修改。
在命令行中,获得完整的标题可以用tasklist /v来查看,查看前建议用mode设定加大缓冲区的宽度,否则会自动换行难以查看。
Re NaturalJ0:
结束指定进程最精确的莫过于通过pid来指定了,通过两次tasklist列表并比较差别可以得到启动进程的pid值,不过比较繁琐,还好可以通过wmic来简单实现:
@echo off
for /f "tokens=2 delims==;" %%i in ('wmic process call create notepad ^| findstr /i "ProcessId"') do @set /a x=%%i
echo 由本脚本启动的notepad进程的pid为:%x%
pause 另外,wmic process可以获得进程的ParentProcessId(父进程pid)和ProcessId(pid),通过ParentProcessId也可以获得父进程的进程名。
|
|
2006-11-15 08:25 |
|
|
pengfei
银牌会员
![](images/default/star.gif) ![](images/default/star.gif) ![](images/default/star.gif) ![](images/default/star.gif) ![](images/default/star.gif)
积分 1218
发帖 485
注册 2006-7-21 来自 湖南.娄底
状态 离线
|
『第
10 楼』:
namejm版主用taskkill /fi 结束指定进程的办法简单省事.
而7楼通过比对两次PID值来终止后来开启的进程的方法. 3742668版主居然用wmic process一个语句就搞定了.
看来有时间得好好学习一下DOS命令了.
|
![](images/common/sigline.gif)
业精于勤而荒于嬉,形成于思而毁于随。 |
|
2006-11-15 09:48 |
|
|
lxmxn
版主
![](images/default/star.gif) ![](images/default/star.gif) ![](images/default/star.gif) ![](images/default/star.gif) ![](images/default/star.gif) ![](images/default/star.gif) ![](images/default/star.gif) ![](images/default/star.gif)
积分 11386
发帖 4938
注册 2006-7-23
状态 离线
|
『第
11 楼』:
Quote: | 查看前建议用mode设定加大缓冲区的宽度,否则会自动换行难以查看。 |
|
用tasklist /v /fo list查看标题就比较清晰了。
|
|
2006-11-15 09:52 |
|
|
NaturalJ0
银牌会员
![](images/default/star.gif) ![](images/default/star.gif) ![](images/default/star.gif) ![](images/default/star.gif) ![](images/default/star.gif)
积分 1181
发帖 533
注册 2006-8-14
状态 离线
|
『第
12 楼』:
大家的方法真多啊。
如果不指定 PID ,似乎还是没法避免重名。 IM 或 TITLE 都有可能会相同。
IM 相同:比如运行两个记事本
TITLE 相同:比如用记事本打开两个同名文件(也可以是同一文件打开两次)
如果使用运行前比较的方法,似乎也不是很完美。
比如批处理打开记事本后定时两分钟后自动关闭它,而在这两分钟内又有多个记事本被打开。
3742668 版主的方法我试着换了其它程序,把记事本换成了 curl (上传文件),换成了播放器(播放视频)。但我都没试成功。(我不懂 WMIC ,可能是我不会用,用错了。不知应该如何使用。)
看了大家的讨论还真是学了不少新东西。非常感谢。^_^
|
|
2006-11-15 22:26 |
|
|
pengfei
银牌会员
![](images/default/star.gif) ![](images/default/star.gif) ![](images/default/star.gif) ![](images/default/star.gif) ![](images/default/star.gif)
积分 1218
发帖 485
注册 2006-7-21 来自 湖南.娄底
状态 离线
|
『第
13 楼』:
Quote: | Originally posted by NaturalJ0 at 2006-11-15 22:26:
如果使用运行前比较的方法,似乎也不是很完美。
比如批处理打开记事本后定时两分钟后自动关闭它,而在这两分钟内又有多个记事本被打开。
|
|
代码稍微修改一下就可以符合你的要求了, 灵活...
@echo off
setlocal enabledelayedexpansion
for /f "tokens=1,2" %%i in ('tasklist /nh^|findstr /i /c:notepad.exe') do (
set pid=!pid! %%j
)
:: 上面的代码加到打开记事本的上行.
start notepad.exe
:: 中间的代码放到你刚打开事本的下行.
if "%pid%"=="" set pid=lack
for /f "tokens=1,2" %%i in ("%pid%") do (
for /f "tokens=1,2" %%a in ('tasklist /nh^|findstr /i /c:notepad.exe') do (
if not "%%i"=="%%b" set kill=!kill!/pid %%b
)
)
:: 下面的代码为终止记录下来的记事本进程.
taskkill %kill% [ Last edited by pengfei on 2006-11-15 at 10:48 PM ]
|
![](images/common/sigline.gif)
业精于勤而荒于嬉,形成于思而毁于随。 |
|
2006-11-15 22:38 |
|
|
NaturalJ0
银牌会员
![](images/default/star.gif) ![](images/default/star.gif) ![](images/default/star.gif) ![](images/default/star.gif) ![](images/default/star.gif)
积分 1181
发帖 533
注册 2006-8-14
状态 离线
|
『第
14 楼』:
Re: pengfei
Quote: | @echo off
cd.>不应该关闭的1.txt
cd.>不应该关闭的2.txt
cd.>不应该关闭的3.txt
cd.>不应该关闭的4.txt
cd.>不应该关闭的5.txt
cd.>应该关闭的.txt
start notepad.exe 不应该关闭的1.txt
start notepad.exe 不应该关闭的2.txt
start notepad.exe 不应该关闭的3.txt
start notepad.exe 不应该关闭的4.txt
start notepad.exe 不应该关闭的5.txt
setlocal enabledelayedexpansion
for /f "tokens=1,2" %%i in ('tasklist /nh^|findstr /i /c:notepad.exe') do (
set pid=!pid! %%j
)
:: 上面的代码加到打开记事本的上行.
start notepad.exe 应该关闭的.txt
:: 中间的代码放到你刚打开事本的下行.
if "%pid%"=="" set pid=lack
for /f "tokens=1,2" %%i in ("%pid%") do (
for /f "tokens=1,2" %%a in ('tasklist /nh^|findstr /i /c:notepad.exe') do (
if not "%%i"=="%%b" set kill=!kill!/pid %%b
)
)
:: 下面的代码为终止记录下来的记事本进程.
echo 5 seconds to close
ping 1 -n 1 -w 5000>nul
taskkill %kill%
echo Is everything OK?
echo Now any key to delete the temp files.
pause>nul
taskkill /f /im "notepad.exe"
del 不应该关闭的?.txt
del 应该关闭的.txt |
|
看了你的代码,我没理解。
我在你的代码中直接加了些(红色部分是我加的,黑色部分是你写的)。
你也可以试试效果。
[ Last edited by NaturalJ0 on 2006-11-15 at 11:43 PM ]
|
|
2006-11-15 23:41 |
|
|
pengfei
银牌会员
![](images/default/star.gif) ![](images/default/star.gif) ![](images/default/star.gif) ![](images/default/star.gif) ![](images/default/star.gif)
积分 1218
发帖 485
注册 2006-7-21 来自 湖南.娄底
状态 离线
|
『第
15 楼』:
我想这样你更容易看懂, 主要是灵活使用代码记录下批处理中打开记事本的PID.
@echo off
cd.>不应该关闭的1.txt
cd.>不应该关闭的2.txt
cd.>应该关闭的1.txt
cd.>应该关闭的2.txt
start 不应该关闭的1.txt
setlocal enabledelayedexpansion
for /f "tokens=1,2" %%i in ('tasklist /nh^|findstr /i /c:notepad.exe') do (
set pid=!pid! %%j
)
:: 上面的代码加到打开记事本的上行.
start 应该关闭的1.txt
start 应该关闭的2.txt
:: 中间的代码放到你刚打开事本的下行.
if "%pid%"=="" set pid=lack
for /f "tokens=1,2" %%i in ("%pid%") do (
for /f "tokens=1,2" %%a in ('tasklist /nh^|findstr /i /c:notepad.exe') do (
if not "%%i"=="%%b" set kill=!kill!/pid %%b
)
)
start notepad.exe 不应该关闭的2.txt
:: 下面的代码为终止记录下来的记事本进程.
echo 现在你可以在WINDOWS下打开任意记事本, 按任意键关闭记录的进程.
pause >nul
taskkill %kill% >nul
echo 进程成功终止!
pause>nul
|
![](images/common/sigline.gif)
业精于勤而荒于嬉,形成于思而毁于随。 |
|
2006-11-15 23:58 |
|