Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Batch file 如何循环执行Windows cmd中的任务,并仅在任务不在列表中时输出任务?_Batch File - Fatal编程技术网

Batch file 如何循环执行Windows cmd中的任务,并仅在任务不在列表中时输出任务?

Batch file 如何循环执行Windows cmd中的任务,并仅在任务不在列表中时输出任务?,batch-file,Batch File,我试图将不需要的任务输出到Windows命令行。最终的结果应该是,我基本上只需点击一个按钮就可以杀死所有不需要的任务。但是为了避免任何问题,我现在正在输出任务名称。我知道还有其他方法,比如在msconfig或regedit上禁用它们,但现在这正是我想要的 问题是我很久没有使用控制台了,这让我有点困惑。下面的代码输出所有正在运行的任务,但它不会停止在mylist数组中输出任务。我认为问题在于我的嵌套for循环,但我不知道有什么其他方法可以将两个数组传递到一个列表中,以便检查它们。任何帮助都将不胜感

我试图将不需要的任务输出到Windows命令行。最终的结果应该是,我基本上只需点击一个按钮就可以杀死所有不需要的任务。但是为了避免任何问题,我现在正在输出任务名称。我知道还有其他方法,比如在
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
始终在列表中,因此应始终包含在分配给环境的字符串中