You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用CMD遍历以ABC开头的服务列表并传递服务名

解决CMD批量获取指定服务名并传递给函数的问题

原代码的问题

  1. CMD中无法直接通过set将管道命令的输出赋值给变量,且set list = ...的写法会创建带空格的变量名(实际变量是list 而非list)。
  2. 用for %%a in (%list%)遍历会将带空格的服务名拆分成多个片段,无法正确获取完整服务名。

正确实现代码

@echo off
setlocal enabledelayedexpansion

:: 遍历所有以ABC开头的服务
for /f "tokens=2 delims=:" %%s in ('sc queryex type=service state=all ^| find /i "SERVICE_NAME: ABC"') do (
    :: 去除服务名开头的空格
    set "service_name=%%s"
    set "service_name=!service_name:~1!"
    echo 找到服务:!service_name!
    :: 调用自定义函数传递服务名
    call :process_service "!service_name!"
)

endlocal
exit /b

:: 定义处理服务的函数
:process_service
set "current_service=%~1"
echo 正在处理服务:%current_service%
:: 在此处添加你的业务逻辑
exit /b

代码说明

  • for /f捕获命令输出:通过'sc queryex ... ^| find ...'执行命令并捕获输出,tokens=2 delims=:表示以冒号为分隔符,提取第二部分(即服务名)。注意管道符|在for /f的命令串里要转义为^|。
  • 处理服务名空格:sc输出的SERVICE_NAME:后带有空格,通过!service_name:~1!截取字符串去掉开头的空格。
  • 延迟变量扩展:setlocal enabledelayedexpansion允许在循环内部实时修改变量值,用!变量名!代替%变量名%来获取更新后的值。
  • 函数调用:call :process_service "!service_name!"将带空格的服务名作为参数传递,函数内用%~1获取去掉引号的参数值。

注意事项

  • sc queryex的参数type=service和state=all后面的空格不能省略,这是sc命令的格式要求。
  • 若需区分服务名大小写,去掉find命令的/i参数即可。

内容的提问来源于stack exchange,提问作者Coelho

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 18:33:22