Как проверить тип запуска службы из пакета script? (в окнах 7)

Мне нужно запустить службу из командного файла (используя sc start XXX), но ТОЛЬКО, если он настроен с автоматическим запуском.

Я прочитал инструкции sc /?, и я попытался сначала вызвать команду sc qc XXX, чтобы запросить его конфигурацию, а затем использовать findstr для результата, но после команды sc qc XXX я получил следующую ошибку:

[SC] QueryServiceConfig FAILED 122:

The data area passed to a system call is too small.

[SC] GetServiceConfig needs 718 bytes

Указанная служба не существует как установленная служба.

Это нечетно, потому что я могу вызвать sc config XXX и остановить/запустить его из командной строки.

Я что-то упустил? Есть ли лучший способ сделать это?

Ответ 1

Хорошо, я только что понял.

Во-первых, я должен извиниться, так как исходная ошибка была на самом деле:

[SC] QueryServiceConfig FAILED 122:

The data area passed to a system call is too small.

[SC] GetServiceConfig needs 718 bytes

а не

[SC] OpenService FAILED 1060:

как я сказал раньше.

По-видимому, мне пришлось явно добавить размер буфера в мою службу: sc qc XXX 1000

После этого я заметил, что поле BINARY_PATH_NAME было очень длинным для XXX, поэтому я предполагаю, что выделение памяти по умолчанию было недостаточно.

Теперь, поскольку я в основном обязан StackOverflow моей карьере, я выложу свой полный код:)

rem start a service, but only if it is configured as automatic, and only if it isn't running already
for /F "tokens=3 delims=: " %%H in ('sc qc %xxx% 1000^| findstr "START_TYPE"') do (
    if /I "%%H" EQU "AUTO_START" (
        rem check if service is stopped
        for /F "tokens=3 delims=: " %%H in ('sc query %xxx% ^| findstr "STATE"') do (
            if /I "%%H" EQU "STOPPED" (
                echo net start %xxx%
                net start %xxx%
            ) else (
                echo %xxx% is already running
            )
        )
    ) else (
        echo Skipping %xxx% since it not defined as automatic start
    )
)