Các tham số cho các dịch vụ được tạo có một số vấn đề hình thành đặc biệt, đặc biệt nếu lệnh bao gồm khoảng trắng hoặc dấu ngoặc kép:
Nếu bạn muốn nhập tham số dòng lệnh cho dịch vụ, bạn phải đặt toàn bộ dòng lệnh trong dấu ngoặc kép. (Và luôn để lại một khoảng trống sau binPath=
và trước trích dẫn đầu tiên, như mrswadge đã chỉ ra)
Vì vậy, để tạo một dịch vụ cho lệnh, PATH\COMMAND.EXE --param1=xyz
bạn sẽ sử dụng tham số binPath sau:
binPath= "PATH\COMMAND.EXE --param1=xyz"
^^ ^
|| |
space quote quote
Nếu đường dẫn đến tệp thực thi chứa khoảng trắng , bạn phải đặt đường dẫn trong dấu ngoặc kép.
Vì vậy, đối với một lệnh có cả tham số và đường dẫn có khoảng trắng, bạn cần dấu ngoặc kép . Bạn phải thoát các trích dẫn bên trong với dấu gạch chéo ngược\" . Điều tương tự giữ nếu các tham số tự chứa dấu ngoặc kép, bạn cũng sẽ cần phải thoát chúng.
Mặc dù sử dụng dấu gạch chéo ngược làm ký tự thoát, bạn không phải thoát dấu gạch chéo ngược thông thường có trong đường dẫn. Điều này trái với cách bạn thường sử dụng dấu gạch chéo ngược làm ký tự thoát.
Vì vậy, đối với một lệnh như
"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
Dưới đây là một ví dụ cụ thể từ tài liệu SVNserve, cho thấy tất cả các trường hợp đặc biệt:
sc create svnserve
binpath= "\"C:\Program Files\CollabNet Subversion Server\svnserve.exe\" --service -r \"C:\my repositories\" "
displayname= "Subversion Server" depend= Tcpip start= auto
(ngắt dòng được thêm vào để dễ đọc, không bao gồm chúng)
Điều này sẽ thêm một dịch vụ mới với dòng lệnh "C:\Program Files\CollabNet Subversion Server\svnserve.exe" --service -r "C:\my repositories"
.
Tóm lại
- không gian sau mỗi tham số sc:
binpath=_
, displayname=_
vàdepend=_
- mỗi tham số sc có chứa khoảng trắng phải được đặt trong dấu ngoặc kép
- tất cả các trích dẫn bổ sung bên trong binpath được thoát với dấu gạch chéo ngược: \"
- tất cả các dấu gạch chéo ngược bên trong binpath không được thoát
binPath= "c:\abc\def.exe /Param1=ghi"
có vẻ như là ý tưởng đúng. Các dấu gạch chéo ngược có cần được thoát không (ví dụ: "c: \\ abc \\ ...")? Điều tồi tệ nhất, bạn có thể trực tiếp chỉnh sửa giá trị Registry sau đó nếu SC.EXE không thể làm điều đó.