Podczas tworzenia usługi Windows przy użyciu:
sc create ServiceName binPath= "the path"
w jaki sposób argumenty mogą być przekazywane do kolekcji Context.Parameters klasy Installer?
Czytam sc.exe
dokumentację, że takie argumenty można było przekazać dopiero na końcu binPath
, ale nie znalazłem przykładu ani nie udało mi się to z powodzeniem zrobić.
windows-services
sympatric greg
źródło
źródło
binPath= "c:\abc\def.exe /Param1=ghi"
wydaje się, że to dobry pomysł. Czy odwrotne ukośniki muszą być znakami ucieczki (np. „C: \\ abc \\ ...”)? Co najgorsze, możesz później bezpośrednio edytować wartość rejestru, jeśli SC.EXE nie może tego zrobić.Odpowiedzi:
Sztuczka polega na pozostawieniu spacji po znaku = w instrukcji create, a także na użyciu „” dla wszystkiego, co zawiera znaki specjalne lub spacje.
Wskazane jest określenie nazwy wyświetlanej usługi, a także ustawienie ustawienia początkowego na automatyczny, aby uruchamiał się automatycznie. Możesz to zrobić, określając
DisplayName= yourdisplayname
istart= auto
w instrukcji tworzenia.Oto przykład:
Jeśli to zadziałało, powinieneś zobaczyć:
AKTUALIZACJA 1
http://support.microsoft.com/kb/251192
źródło
binPath= "C:\..."
) musi być obecna, inaczej to nie zadziała.start= auto
jest ważna, więc po ponownym uruchomieniu usługa zostanie automatycznie uruchomiona. Bardzo dobrze, jeśli użytkownik końcowy nie jest ekspertembinPath
które wymagają cytaty muszą być chronione (\"
) Przykład: Jeśli ścieżka byłac:\some long path\some.exe "first argument"
musiałaby byćbinPath= "\"c:\some long path\some.exe\" \"first argument\""
binPath= ...
iDisplayName= ...
; w moim przypadku zapomniałem „=” po DisplayName), konsola wydrukuje instrukcje użyciacreate
polecenia; jak:DESCRIPTION: Creates a service entry... USAGE: sc <server> create....
etcParametry dla tworzonych usług mają specyficzne problemy z formatowaniem, w szczególności jeśli polecenie zawiera spacje lub cudzysłowy:
Jeśli chcesz wprowadzić parametry wiersza poleceń dla usługi, musisz ująć cały wiersz poleceń w cudzysłów. (I zawsze zostawiaj spację po
binPath=
i przed pierwszym cudzysłowem, jak zauważyła pani mrswadge)Tak więc, aby utworzyć usługę dla polecenia
PATH\COMMAND.EXE --param1=xyz
, należy użyć następującego parametru binPath:Jeśli ścieżka do pliku wykonywalnego zawiera spacje , trzeba ująć ścieżkę w cudzysłów.
Więc dla polecenia, które ma oba parametry i ścieżkę ze spacjami, potrzebujesz zagnieżdżonych cudzysłowów . Musisz uciec od wewnętrznych cudzysłowów za pomocą odwrotnych ukośników \". To samo dotyczy sytuacji, gdy parametry same w sobie zawierają cudzysłowy, musisz je również uciec.
Pomimo używania ukośników odwrotnych jako znaków ucieczki, nie musisz uciekać przed zwykłymi ukośnikami odwrotnymi zawartymi na ścieżce. Jest to sprzeczne z tym, jak zwykle używasz odwrotnych ukośników jako znaków ucieczki.
Więc dla polecenia takiego jak
"PATH WITH SPACES \COMMAND.EXE" --param-with-quotes="a b c" --param2
:Oto konkretny przykład z dokumentacji SVNserve, który pokazuje wszystkie specjalne przypadki:
(dla czytelności dodawane są podziały wierszy, nie uwzględniaj ich)
To dodałoby nową usługę z linią poleceń
"C:\Program Files\CollabNet Subversion Server\svnserve.exe" --service -r "C:\my repositories"
.Podsumowując
binpath=_
,displayname=_
idepend=_
źródło
binPath= "myservice.exe
. Interpreter wiersza poleceń musi się tego spodziewać i wymagać, aby polecenie stało się tokenizowane przy użyciu spacji jako separatora.Zobacz tutaj: Modyfikowanie „ścieżki do pliku wykonywalnego” usługi systemu Windows
źródło
Miałem problemy z uruchomieniem tego w systemie Windows 7. Wydawało się, że zignorowano pierwszy argument, który podałem, więc użyłem
binPath= "C:\path\to\service.exe -bogusarg -realarg1 -realarg2"
i zadziałało.źródło
Po prostu tworzę go bez parametrów, a następnie edytuję rejestr
HKLM\System\CurrentControlSet\Services\[YourService]
.źródło
To polecenie działa:
źródło
Należy również wziąć pod uwagę sposób uzyskiwania dostępu do argumentów w kodzie aplikacji.
W mojej aplikacji C # użyłem klasy ServiceBase:
Zarejestrowałem usługę za pomocą
sc create myService binpath = "MeyService.exe arg1 arg2"
Ale nie mogłem uzyskać dostępu do argumentów za pośrednictwem
args
zmiennej, gdy uruchamiam ją jako usługę.Dokumentacja MSDN sugeruje, aby nie używać metody Main do pobierania argumentów
binPath
lubImagePath
. Zamiast tego sugeruje umieszczenie logiki wOnStart
metodzie, a następnie użycie (C #)Environment.GetCommandLineArgs();
.Aby uzyskać dostęp do pierwszych argumentów
arg1
, muszę zrobić w ten sposób:to by się wydrukowało
źródło
Znalazłem sposób na użycie sc.
sc config binPath = "\" c: \ ścieżka ze spacjami \ service_executable.exe \ ""
Innymi słowy, użyj \, aby uciec przed wszystkimi znakami ", które chcesz przetrwać przejście do rejestru.
źródło
Przykład tworzenia usługi z użyciem odwrotnych ukośników z wieloma podwójnymi cudzysłowami.
źródło
Upewnij się, że na początku i na końcu wartości binPath znajdują się cudzysłowy.
źródło
Nie mogłem poradzić sobie z problemem z twoimi propozycjami, na końcu z folderem x86 działał tylko w Power Shell (Windows Server 2012) przy użyciu zmiennych środowiskowych:
źródło
Jeśli wypróbowałeś wszystkie powyższe i nadal nie możesz przekazać argumentów do swojej usługi, jeśli twoja usługa została napisana w C / C ++, oto, co może być problemem: kiedy uruchamiasz usługę przez "sc start arg1 arg2 ..." , SC wywołuje funkcję ServiceMain usługi bezpośrednio z tymi argumentami. Ale kiedy system Windows uruchamia usługę (na przykład podczas rozruchu), wywoływana jest główna funkcja usługi (_tmain) z parametrami z „binPath” rejestru.
źródło
nie działa w Powershell i powinien używać CMD w moim przypadku
źródło