如果在任务列表中找到特定任务/进程,则使用批处理脚本结束它

问题描述 投票:0回答:1

对于上下文,我在 XAMPP 批处理文件中找到了这个:

@echo off 
SetLocal EnableDelayedExpansion
set "PID_LIST="

for /f "tokens=2" %%V in ('tasklist.exe ^| findstr /i "%1" 2^>NUL') do @set "PID_LIST=!PID_LIST! /PID %%V"

if defined PID_LIST (
  taskkill.exe /F %PID_LIST%
) else (
  echo Process %1 not running
)

SetLocal DisableDelayedExpansion
exit

我希望编写一个脚本来结束与我的网络服务器相关的所有任务。我对批处理有基本的了解,所以我已经能够解释这个脚本的大部分功能:

  1. for循环需要延迟扩展
  2. for 循环从
    PID
    获取第二个标记 (
    tasklist
    ) 并将其保存到变量中,其中任务由参数
    1
    给出。
  3. 如果找到任务,则会以
    taskkill
  4. 结束

基于此我走了这么远:

@echo off
cd /D %~dp0
for /f "tokens=2" %%V in ('tasklist.exe ^| findstr /i "httpd.exe" 2^>NUL') do taskkill.exe /pid /f %%V
for /f "tokens=2" %%V in ('tasklist.exe ^| findstr /i "mysql" 2^>NUL') do taskkill.exe /pid /f %%V
:: etc

但理想情况下我会将其折叠成一个 for 循环。 如何将

or
逻辑添加到
findstr
表达式中?

我还有一些问题,我无法在任何地方找到快速答案。有谁能在评论里回答一下吗?

  1. 在我的脚本中,我需要
    EnableDelayedExpansion
    吗?
  2. 让变量未定义,
    set "PID_LIST="
    的目的是什么?
  3. 我不完全理解命令管道
    findstr
    2^>NUL
    的含义是什么,为什么需要关心
    >
  4. set
    命令如何将
    !VARIABLE!
    附加到变量上?
batch-file findstr taskkill tasklist
1个回答
0
投票
  1. 第一个脚本中是的;第二次没有。
  2. 确保
    PID_LIST
    未定义,以防在之前的某些操作中未定义它。
  3. 2>nul
    将错误消息从命令重定向到 nowhere 而不是控制台。重定向器之前的插入符号是转义字符,告诉解析器重定向器是前一个命令的一部分,而不是
    for
    的一部分。
  4. delayedexpansion
    生效时,
    !var!
    检索变量的 current 值,而
    %var%
    则替换为解析代码块(带括号的行序列)时变量 的值).

温馨提示:
始终使用

setlocal
风味以避免环境混乱。如果使用
setlocal
(通常直接在
@echo off
行之后),那么当批处理结束时,对环境的任何更改都将被撤消,因此连续的批处理不会累积更改,并且每当批处理开始时的环境状态将始终是一样。

参见 Stephan 的 DELAYEDEXPANSION 链接

要实现您寻求的

or
,请使用

findstr /i /c:"httpd.exe" /c:"mysql"

(您可以添加任意数量的

/c:"literalstring"
元素。

findstr
还可提供

findstr /i "httpd.exe mysql"

在这种情况下;字面意义上的空间

string or string
。如果您想要定位包含空格的字符串,请使用
/c:"this string" /c:"that string"
语法。

请参阅提示中的

findstr /?
以获取更多文档 - 或查看 SO 上的数千个示例

© www.soinside.com 2019 - 2024. All rights reserved.