首页 > 解决方案 > SC Query 在 BATCH FILE 'FOR' 循环中使用时返回错误

问题描述

尝试在批处理文件 FOR 循环中使用以下代码行:

FOR /F "delims=" %%g IN ('sc query type=service ^| FIND /I "bthserv"') DO ( ECHO %%g )

从 CMD 提示符中使用时,括号中的命令可以成功运行。

但是,在 FOR 循环中,它只返回:

[SC] EnumQueryServicesStatus:OpenService 失败 123:

文件名、目录名或卷标语法不正确。

是否有人熟悉此错误以及如何让 FOR 循环报告具有特定或相似名称的所有服务?

[编辑 /]

即使将命令更改为此也会失败并显示相同的消息:

FOR /F "delims=" %%g IN ('sc query type^= service ^| FIND /I "bthserv"') DO ( ECHO %%g )

标签: windowsfor-loopbatch-fileservice

解决方案


首先,您的标题令人困惑,因为它queryex不像query您的代码那样使用。

除此之外query type=service无效,应该是query type= service, (后面的空格=是必须的)

但是,我也对您的命令感到有些困惑,我不确定您是否想知道是否有一个名为 的活动服务bthserv,或者是否有一个名称包含不区分大小写的字符串的活动服务bthserv

如果您想知道是否有一个名为 的活动服务bthserv,您应该只按名称查询它,query bthserv. 从那里您可以简单地使用&&and||来处理成功和不成功的命令,(我刚刚使用了Echo下面的命令)

例子:

@%__AppDir__%sc.exe query bthserv 1> NUL && (Echo bthserv is an installed service) || Echo bthserv is not an installed service

或者,您可以使用ErrorLevel.

例子:

@%__AppDir__%sc.exe query bthserv 1> NUL
@If ErrorLevel 1 (Echo bthserv is not an installed service)Else Echo bthserv is an installed service

如果您想知道是否存在名称包含不区分大小写的字符串 (不匹配) 的活动服务bthserv那么find就可以了。

但是,当您在中运行该命令时,该=字符被实例视为分隔符cmd.exe,该命令被传递给。因此,您需要使用插入符号来逃避它,^. 除此之外,如果要捕获匹配的服务名称,则需要使用默认值     TAB分隔符选择第一个标记之后的所有内容。

例子:

@For /F "Tokens=1,*" %%G In ('%__AppDir__%sc.exe query type^= service ^| %__AppDir__%find.exe /I "bthserv"') Do @Echo %%H

但是,您也可以将传递给cmd.exe实例的整个字符串括在双引号中,而无需转义任何内容。

例子:

@For /F "Tokens=1,*" %%G In ('"%__AppDir__%sc.exe query type= service | %__AppDir__%find.exe /I "bthserv""') Do @Echo %%H

推荐阅读