Начнем с того, что ваш заголовок сбивает с толку, потому что он использует queryex
, а не query
, как в вашем коде.
Вдобавок к этому query type=service
недействителен, он должен быть query type= service
, (требуется пробел после =
) .
Однако меня также немного смущает ваша команда, я не уверен, хотите ли вы знать, есть ли активная служба с именем bthserv
, или если есть активная служба с именем, содержащим нечувствительную к регистру строку bthserv
.
Если вы хотите узнать, есть ли активная служба с именем bthserv
, вы действительно следует просто запросить его по имени, query bthserv
. Оттуда вы можете просто использовать &&
и ||
для успешных и неудачных команд, (я только что использовал 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 подойдет.
Однако, когда вы запускаете эту команду в для -l oop, символ =
рассматривается как разделитель экземпляром 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