Parametry 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:
binPath= "PATH\COMMAND.EXE --param1=xyz"
^^ ^
|| |
space quote quote
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
:
binPath= "\"PATH WITH SPACES \COMMAND.EXE\" --param-with-quotes=\"a b c\" --param2"
^ ^ ^ ^ ^ ^ ^
| | | | | | |
opening escaped regular escaped escaped closing
quote quote backslash closing quotes quote
for for in quote for for
whole path path for path parameter whole
command command
Oto konkretny przykład z dokumentacji SVNserve, który pokazuje wszystkie specjalne przypadki:
sc create svnserve
binpath= "\"C:\Program Files\CollabNet Subversion Server\svnserve.exe\" --service -r \"C:\my repositories\" "
displayname= "Subversion Server" depend= Tcpip start= auto
(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
- miejsce po każdego parametru SC:
binpath=_
, displayname=_
idepend=_
- każdy parametr sc zawierający spacje musi być ujęty w cudzysłów
- wszystkie dodatkowe cudzysłowy wewnątrz binpath są poprzedzone odwrotnym ukośnikiem: \"
- wszystkie ukośniki odwrotne wewnątrz binpath nie są chronione
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ć.