S C Запрос возвращает ошибки при использовании в цикле BATCH FILE 'FOR' - PullRequest
0 голосов
/ 27 мая 2020

Попытка использовать следующую строку кода в пакетном файле ДЛЯ l oop:

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

Команда в квадратных скобках успешно работает при использовании из подсказки CMD.

Однако в FOR l oop он просто возвращает:

[SC] EnumQueryServicesStatus: OpenService FAILED 123:

Неправильное имя файла, имя каталога или синтаксис метки тома.

Кто-нибудь знаком с этой ошибкой и как заставить FOR l oop сообщать обо всех службах с указанным c или похожим именем (именами)?

[Edit /]

Даже изменить команду на это не удается с тем же сообщением:

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

1 Ответ

0 голосов
/ 27 мая 2020

Начнем с того, что ваш заголовок сбивает с толку, потому что он использует 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, (не соответствует ей) , тогда команда подойдет.

Однако, когда вы запускаете эту команду в , символ = рассматривается как разделитель экземпляром 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
...