使用了Windows下的findstr、taskList、taskKill、echo、for命令。
在Windows的命令行下,怎么杀掉某进程(比如,杀掉所有的mspaint.exe画图进程)
代码:
@echo off
echo '===begin==='
for /f "tokens=1,2 delims= ," %%a in ('tasklist /m ^| findstr "mspaint.exe"') do (
echo name=%%a, PID = %%b, and will kill it.
TASKKILL /PID %%a
)
echo "====end===="
pause
解释:括号里的命令可能得到很多行文本,对于每一行文本,按照空格和逗号(delims= ,)进行截取,取出来第1个字段送给%a,第2个字段送给%b,然后送到do里面,然后打印一句话,然后用TaskKill命令把这个进程号对应的进程杀掉。
命令echo:echo后面跟随的语句,不需要用引号引起来。
下面的命令可以看到,datetimeStr这个时间戳,不论在引号里面还是外面,都正常显示了,反倒是引号,也跟着输出了。
@echo off
set datetimeStr=%date:~0,4%/%date:~5,2%/%date:~8,2% %time:~0,2%:%time:~3,2%:%time:~6,2%
echo %datetimeStr%, bat script.
echo '%datetimeStr%, bat script.'
echo %datetimeStr%",bat script."
echo %datetimeStr%, bat script. > D:\test_echo.log
命令taskList:自己用taskList /?查看帮助。运行如下命令并查看log文件。
tasklist /m > D:\tasklist.log
命令findstr:自己用findstr /?查看帮助。运行如下命令并查看log文件。
tasklist /m | findstr "svchost.exe" > tasklist_findstr.log
命令taskKill:自己用taskKill /?查看帮助。命令for:用for /?查看帮助。
通过帮助文档我们知道,for有一种使用方法:
FOR /F ["options"] %variable IN ('command') DO command [command-parameters]
帮助文档中有一个例子非常好,请先查看一下:
FOR /F "eol=; tokens=2,3* delims=, " %i in (myfile.txt) do @echo %i %j %k
对于FOR /F 的【IN ('command')】部分:其中的command需要替换成一个命令语句,比如【tasklist /M | findstr "mspaint"】,但是替换时需要注意:
①命令需要用单引号引上②竖线(|)之前需要一个转义字符^,为【'tasklist /m ^| findstr "mspaint.exe"'】。
对于FOR /F 的【DO command [command-parameters]】部分:
do后面可以直接跟一个命令,也可以在do后面写一对小括号,将许多语句写在小括号里面。
注意:do后需要有一个空格,空格后是左括号;即,do和左括号在一行,但不能写在一起。
@echo off
echo '===begin==='
for /f "tokens=1,2" %%a in ('tasklist /m ^| findstr "svchost.exe"') do (
echo name=%%a
echo pid==%%b
echo name=%%a, pid=%%b
echo =========
)
echo "====end===="
pause
对于FOR /F 的【%variable】部分:建议写【%a】,如果要写在.bat文件里,需要多加一个%号,为【%%a】。不过,当然可以写%i或%x等。
对于FOR /F 的【["options"]】部分:
建议阅读帮助文档中的例子。
我们查看了【tasklist /m | findstr "svchost.exe" > tasklist_findstr.log】生成的文件的格式。生成的log文件中,各个字段之间是用空格和逗号分隔的。
又【delims=xxx - 指分隔符集。这个替换了空格和跳格键的默认分隔符集】,所以,我们需要写成【delims= ,】才行。
又【tokens=x,y,m-n - 指每行的哪一个符号被传递到每个迭代的 for 本身】,并且【%variable】写的是【%a】,那么:
写成【tokens=1,2,3,4,5】那么会将第1~第5个字段传到迭代的for本身(就是传到do里面),用%a~%e获取第1~第5个字段的值。
写成【tokens=1,3-5】那么会将1和3~5送到do里面。其中,1对应%a,3对应%b,4对应%d,5对应%e。
写成【tokens=2,*】那么会将2和2后面的字段送到do里面去。其中2对应%a,2后面的所有数据对应%b。