对于上下文,我在 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
我希望编写一个脚本来结束与我的网络服务器相关的所有任务。我对批处理有基本的了解,所以我已经能够解释这个脚本的大部分功能:
PID
获取第二个标记 (tasklist
) 并将其保存到变量中,其中任务由参数 1
给出。taskkill
基于此我走了这么远:
@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
表达式中?
我还有一些问题,我无法在任何地方找到快速答案。有谁能在评论里回答一下吗?
EnableDelayedExpansion
吗?set "PID_LIST="
的目的是什么?findstr
:2^>NUL
的含义是什么,为什么需要关心>
?set
命令如何将!VARIABLE!
附加到变量上?PID_LIST
未定义,以防在之前的某些操作中未定义它。2>nul
将错误消息从命令重定向到 nowhere 而不是控制台。重定向器之前的插入符号是转义字符,告诉解析器重定向器是前一个命令的一部分,而不是 for
的一部分。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 上的数千个示例