Batch file 如何循环执行Windows cmd中的任务,并仅在任务不在列表中时输出任务?
我试图将不需要的任务输出到Windows命令行。最终的结果应该是,我基本上只需点击一个按钮就可以杀死所有不需要的任务。但是为了避免任何问题,我现在正在输出任务名称。我知道还有其他方法,比如在Batch file 如何循环执行Windows cmd中的任务,并仅在任务不在列表中时输出任务?,batch-file,Batch File,我试图将不需要的任务输出到Windows命令行。最终的结果应该是,我基本上只需点击一个按钮就可以杀死所有不需要的任务。但是为了避免任何问题,我现在正在输出任务名称。我知道还有其他方法,比如在msconfig或regedit上禁用它们,但现在这正是我想要的 问题是我很久没有使用控制台了,这让我有点困惑。下面的代码输出所有正在运行的任务,但它不会停止在mylist数组中输出任务。我认为问题在于我的嵌套for循环,但我不知道有什么其他方法可以将两个数组传递到一个列表中,以便检查它们。任何帮助都将不胜感
msconfig
或regedit
上禁用它们,但现在这正是我想要的
问题是我很久没有使用控制台了,这让我有点困惑。下面的代码输出所有正在运行的任务,但它不会停止在mylist
数组中输出任务。我认为问题在于我的嵌套for
循环,但我不知道有什么其他方法可以将两个数组传递到一个列表中,以便检查它们。任何帮助都将不胜感激
@echo off
set mylist=csrss.exe, dwm.exe, System, smss.exe Rem<<List
for /f "tokens=1" %%a in ('tasklist') do ( Rem<<This returns process name
for %%b in ('%mylist%') do ( Rem<<b is MEANT to be each process in list
if not %%a == %%b ( Rem<<If anything in tasklist is in mylist, don't include it
echo %%a) Rem<<Output processes NOT in mylist.
)
)
pause
@echo关闭
设置mylist=csrss.exe,dwm.exe,System,smss.exe Rem这在findstr的帮助下更容易:
@echo off
set "mylist=csrss.exe dwm.exe System smss.exe"
for /f "tokens=1" %%a in ('tasklist^|findstr /biv "%mylist%"') do echo %%a
pause
findstr
开关:
-b=行的开头
-i=忽略大写字母(可选)
-v=排除给定字符串这在findstr
的帮助下更容易:
@echo off
set "mylist=csrss.exe dwm.exe System smss.exe"
for /f "tokens=1" %%a in ('tasklist^|findstr /biv "%mylist%"') do echo %%a
pause
findstr
开关:
-b=行的开头
-i=忽略大写字母(可选)
-v=排除给定字符串另一个解决方案:
@echo off
echo Running tasks not in list:
echo/
setlocal EnableExtensions EnableDelayedExpansion
set "mylist=,csrss.exe,dwm.exe,System,smss.exe,cmd.exe,tasklist.exe,"
for /F "skip=3 eol=| tokens=1" %%I in ('%SystemRoot%\system32\tasklist.exe') do (
if "!mylist:,%%I,=!" == "!mylist!" echo %%I
)
endlocal
pause
首先,有一个环境变量mylist
,它用逗号分隔每个进程名,包括First和last
FOR在一个单独的命令进程中运行,该进程从命令行后台的cmd.exe/C
开始:
C:\Windows\system32\tasklist.exe
此控制台应用程序以两行标题输出所有正在运行的任务,通常是系统空闲进程
,作为处理后台命令进程的STDOUT的第一个进程
FOR捕获此输出并逐行处理,跳过空行,此外,由于skip=3
,因此始终会跳过前三行
一个可执行文件名以开头是非常不寻常的,但也是可能的
这是的行尾选项的默认字符。因此,eol=|
将竖线重新定义为行尾字符,任何文件名都不能包含该字符,因此,不会忽略任何进程行
tokens=1
导致将第一个空格/制表符分隔字符串分配给指定的循环变量I
。因此,此解决方案仅适用于文件名不包含空格字符的进程
FOR运行IF,执行区分大小写的字符串比较。左边的字符串是分配给环境变量mylist
的字符串值,当前进程名的所有引用都被两边的逗号包围,不区分大小写,替换为零。右字符串是分配给环境变量mylist
的未修改字符串值
所以当前进程名不在左字符串的列表中,因为左字符串中没有删除任何内容,所以左字符串等于右字符串。在这种情况下,将输出进程名称
cmd.exe
和tasklist.exe
始终在列表中,因此应始终包含在分配给环境变量mylist
的字符串中
要了解所使用的命令及其工作方式,请打开命令提示符窗口,在其中执行以下命令,并非常仔细地阅读为每个命令显示的所有帮助页面
echo/?
endlocal/?
获取/?
如果/?
暂停/?
设置/?
setlocal/?
还有一个解决方案:
@echo off
echo Running tasks not in list:
echo/
setlocal EnableExtensions EnableDelayedExpansion
set "mylist=,csrss.exe,dwm.exe,System,smss.exe,cmd.exe,tasklist.exe,"
for /F "skip=3 eol=| tokens=1" %%I in ('%SystemRoot%\system32\tasklist.exe') do (
if "!mylist:,%%I,=!" == "!mylist!" echo %%I
)
endlocal
pause
首先,有一个环境变量mylist
,它用逗号分隔每个进程名,包括First和last
FOR在一个单独的命令进程中运行,该进程从命令行后台的cmd.exe/C
开始:
C:\Windows\system32\tasklist.exe
此控制台应用程序以两行标题输出所有正在运行的任务,通常是系统空闲进程
,作为处理后台命令进程的STDOUT的第一个进程
FOR捕获此输出并逐行处理,跳过空行,此外,由于skip=3
,因此始终会跳过前三行
一个可执行文件名以开头是非常不寻常的,但也是可能的
这是的行尾选项的默认字符。因此,eol=|
将竖线重新定义为行尾字符,任何文件名都不能包含该字符,因此,不会忽略任何进程行
tokens=1
导致将第一个空格/制表符分隔字符串分配给指定的循环变量I
。因此,此解决方案仅适用于文件名不包含空格字符的进程
FOR运行IF,执行区分大小写的字符串比较。左边的字符串是分配给环境变量mylist
的字符串值,当前进程名的所有引用都被两边的逗号包围,不区分大小写,替换为零。右字符串是分配给环境变量mylist
的未修改字符串值
所以当前进程名不在左字符串的列表中,因为左字符串中没有删除任何内容,所以左字符串等于右字符串。在这种情况下,将输出进程名称
cmd.exe
和tasklist.exe
始终在列表中,因此应始终包含在分配给环境的字符串中