При создании службы Windows с использованием:
sc create ServiceName binPath= "the path"
как можно передать аргументы в коллекцию Context.Parameters класса установщика?
Я читал sc.exe
документацию, что такие аргументы можно было передать только в конце binPath
, но я не нашел примера и не смог успешно это сделать.
windows-services
сочувствующий Грег
источник
источник
binPath= "c:\abc\def.exe /Param1=ghi"
идея кажется правильной. Нужно ли экранировать обратную косую черту (например, "c: \\ abc \\ ...")? Хуже всего то, что вы могли напрямую редактировать значение реестра после этого, если SC.EXE не может этого сделать.Ответы:
Уловка состоит в том, чтобы оставить пробел после = в вашем операторе создания, а также использовать "" для всего, что содержит специальные символы или пробелы.
Рекомендуется указать отображаемое имя для службы, а также установить для параметра запуска значение авто, чтобы он запускался автоматически. Вы можете сделать это, указав
DisplayName= yourdisplayname
иstart= auto
в своем операторе создания.Вот пример:
Если это сработало, вы должны увидеть:
ОБНОВЛЕНИЕ 1
http://support.microsoft.com/kb/251192
источник
binPath= "C:\..."
) должен быть пробел , иначе это не сработает.start= auto
является важным, поэтому после перезагрузки служба запустится автоматически. Очень хорошо, если конечный пользователь не является экспертомbinPath
которые требуют кавычек, они должны быть экранированы (\"
) пример: если бы путь был,c:\some long path\some.exe "first argument"
он должен был бы бытьbinPath= "\"c:\some long path\some.exe\" \"first argument\""
binPath= ...
иDisplayName= ...
; в моем случае я забыл «=» после DisplayName), тогда консоль напечатает инструкции по использованию дляcreate
команды; например:DESCRIPTION: Creates a service entry... USAGE: sc <server> create....
etcПараметры для созданных сервисов имеют некоторые специфические проблемы с форматированием, в частности, если команда включает пробелы или кавычки:
Если вы хотите ввести параметры командной строки для службы, вы должны заключить всю командную строку в кавычки. (И всегда оставляйте пробел после
binPath=
и перед первой цитатой, как указала миссис Уэдж)Итак, чтобы создать службу для команды,
PATH\COMMAND.EXE --param1=xyz
вы должны использовать следующий параметр binPath:Если путь к исполняемому файлу содержит пробелы , вы должны заключить путь в кавычки.
Итак, для команды, которая имеет оба параметра и путь с пробелами, вам нужны вложенные кавычки . Вы должны избегать внутренних кавычек с помощью обратной косой черты \". То же самое верно, если сами параметры содержат кавычки, вам также нужно будет избегать их.
Несмотря на использование обратной косой черты в качестве escape-символов, вам не нужно избегать обычных обратных косых черт, содержащихся в пути. Это противоречит тому, как вы обычно используете обратную косую черту в качестве escape-символов.
Итак, для такой команды
"PATH WITH SPACES \COMMAND.EXE" --param-with-quotes="a b c" --param2
:Вот конкретный пример из документации SVNserve, в котором показаны все особые случаи:
(разрывы строк добавлены для удобства чтения, не включайте их)
Это добавило бы новую службу с командной строкой
"C:\Program Files\CollabNet Subversion Server\svnserve.exe" --service -r "C:\my repositories"
.Итак, в итоге
binpath=_
,displayname=_
иdepend=_
источник
binPath= "myservice.exe
. Интерпретатор командной строки должен ожидать этого и требовать токенизации команды с использованием пробела в качестве разделителя.См. Здесь: Изменение «Пути к исполняемому файлу» службы Windows
источник
У меня были проблемы с тем, чтобы заставить это работать в Windows 7. Казалось, что первый аргумент, который я передал, игнорировался, поэтому я использовал,
binPath= "C:\path\to\service.exe -bogusarg -realarg1 -realarg2"
и он сработал.источник
Я использую просто создавать его без параметров, а потом редактировать реестр
HKLM\System\CurrentControlSet\Services\[YourService]
.источник
Эта команда работает:
источник
Также важно учитывать, как вы получаете доступ к аргументам в коде приложения.
В моем приложении на C # я использовал класс ServiceBase:
Я зарегистрировал свой сервис с помощью
sc create myService binpath = "MeyService.exe arg1 arg2"
Но я не мог получить доступ к аргументам через
args
переменную, когда я запускаю ее как службу.В документации MSDN предлагается не использовать метод Main для получения аргументов
binPath
илиImagePath
. Вместо этого он предлагает поместить вашу логику вOnStart
метод, а затем использовать (C #)Environment.GetCommandLineArgs();
.Чтобы получить доступ к первым аргументам,
arg1
мне нужно сделать так:это напечатает
источник
Я нашел способ использовать sc.
sc config binPath = "\" c: \ путь с пробелами в нем \ service_executable.exe \ ""
Другими словами, используйте \ для экранирования любых символов ", которые вы хотите сохранить при передаче в реестр".
источник
Пример создания службы с использованием обратной косой черты с множеством двойных кавычек.
источник
Убедитесь, что в начале и в конце значения binPath есть кавычки.
источник
Я не мог решить проблему с вашими предложениями, в конце с папкой x86 она работала только в Power Shell (Windows Server 2012) с использованием переменных среды:
источник
Если вы попробовали все вышеперечисленное и по-прежнему не можете передавать аргументы своей службе, если ваша служба была написана на C / C ++, вот в чем может быть проблема: когда вы запускаете службу с помощью «sc start arg1 arg2 ...» , SC вызывает функцию ServiceMain вашего сервиса напрямую с этими аргументами. Но когда Windows запускает вашу службу (например, во время загрузки), вызывается основная функция вашей службы (_tmain) с параметрами из «binPath» реестра.
источник
он не работает в Powershell и должен использовать CMD в моем случае
источник