您如何批量将For循环的变量放在引号周围?

时间:2019-05-23 13:53:27

标签: batch-file for-loop windows-services

我正在处理一个批处理脚本,该脚本将获取服务器列表,遍历服务器,在每个服务器上查找以特定值开头的每个服务,并查询该服务。但是,鉴于可以使用空格创建服务名称,因此我需要能够在for变量两边加上引号。最好的方法是什么?

我尝试了各种在变量之前和之后放置转义字符的方法。我还尝试将循环变量设置为单独的变量。

@ECHO off
ECHO Please list servers to query.
SET list=
SET /P list=Server Names:

FOR %%a IN (%list%) DO (
  FOR /F "Skip=1 Delims-" %%b IN ('wmic service where "name like 'ADOBE%%'" get Name ^| findstr /r /v "^$"') DO (
  ECHO %%b
  sc \\%%a query ^"%%b^"
  )
)
pause
GOTO :eof

输出显示在%list%中输入的其中一台服务器上以“ ADOBE”开头的任何服务的服务名称。

我得到的是“ EnumQueryServiceStatus:OpenService失败1060: 指定的服务不存在为已安装的服务。“

当我允许脚本回显时,我看到以下内容: HO Adob​​eARM服务 “ \ [服务器名]查询” Adob​​eARMservice

1 个答案:

答案 0 :(得分:1)

主要问题是由于wmic的输出中有空格和回车符。如果在代码中与%%b的行中的echo周围加上引号,则会看到输出中缺少右引号。

工作代码:

@echo off
setlocal enabledelayedexpansion
FOR /F "Skip=1 Delims=" %%b IN ('wmic service where "name like 'ADOBE%%'" get Name ^| findstr /r /v "^$"') DO (
  for /f "delims=" %%c in ("%%b") do ( rem this will get rid of CR character
   set d=%%c
   :loop
   if "!d:~-1!"==" " ( rem here we'll remove the trailing spaces
      set d=!d:~0,-1!
      goto :loop
   )

   echo "%d%"
   sc query "%d%"
   )
)