พารามิเตอร์สำหรับบริการที่สร้างขึ้นมีปัญหาในการจัดรูปแบบเฉพาะโดยเฉพาะถ้าคำสั่งมีช่องว่างหรือเครื่องหมายคำพูด:
หากคุณต้องการป้อนพารามิเตอร์บรรทัดคำสั่งสำหรับบริการคุณจะต้องใส่บรรทัดคำสั่งทั้งหมดในเครื่องหมายคำพูด (และมักจะเว้นช่องว่างหลังbinPath=
และก่อนที่จะพูดครั้งแรกตามที่ mrswadge ชี้ให้เห็น)
ดังนั้นเพื่อสร้างบริการสำหรับคำสั่งPATH\COMMAND.EXE --param1=xyz
คุณจะใช้พารามิเตอร์ binPath ต่อไปนี้:
binPath= "PATH\COMMAND.EXE --param1=xyz"
^^ ^
|| |
space quote quote
หากเส้นทางไปยังแฟ้มที่ปฏิบัติการได้มีช่องว่างคุณจะต้องใส่เส้นทางในเครื่องหมายคำพูด
ดังนั้นสำหรับคำสั่งที่มีทั้งพารามิเตอร์และเส้นทางที่มีช่องว่างที่คุณจะต้องคำพูดที่ซ้อนกัน \"คุณจะต้องหลบหนีคำพูดด้านที่มีเครื่องหมาย การเก็บเดียวกันถ้าพารามิเตอร์ตัวเองมีคำพูดคุณจะต้องหลบหนีเหล่านั้นด้วย
แม้จะใช้เครื่องหมายแบ็กสแลชเป็นอักขระเลี่ยงคุณไม่จำเป็นต้องหลบหนีแบ็กสแลชปกติที่อยู่ในพา ธ นี่ตรงกันข้ามกับวิธีที่คุณใช้แบ็กสแลชเป็นอักขระเลี่ยง
ดังนั้นสำหรับคำสั่งเช่น
"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
นี่คือตัวอย่างที่เป็นรูปธรรมจากเอกสาร SVNserve ซึ่งแสดงกรณีพิเศษทั้งหมด:
sc create svnserve
binpath= "\"C:\Program Files\CollabNet Subversion Server\svnserve.exe\" --service -r \"C:\my repositories\" "
displayname= "Subversion Server" depend= Tcpip start= auto
(มีการเพิ่มการแบ่งบรรทัดสำหรับการอ่านได้ แต่ไม่รวม)
"C:\Program Files\CollabNet Subversion Server\svnserve.exe" --service -r "C:\my repositories"
นี้จะเพิ่มบริการใหม่ที่มีบรรทัดคำสั่ง
ดังนั้นโดยสรุป
- ช่องว่างหลังพารามิเตอร์ sc แต่ละตัว:
binpath=_
, displayname=_
และdepend=_
- พารามิเตอร์ sc แต่ละตัวที่มีช่องว่างต้องอยู่ในเครื่องหมายคำพูด
- เครื่องหมายอัญประกาศเพิ่มเติมทั้งหมดภายใน binpath มีการหลบหนีด้วยแบ็กสแลช: \"
- แบ็กสแลชทั้งหมดที่อยู่ใน binpath จะไม่ถูก Escape
binPath= "c:\abc\def.exe /Param1=ghi"
ดูเหมือนเป็นแนวคิดที่ถูกต้อง แบ็กสแลชจำเป็นต้องหลบหนี (เช่น "c: \\ abc \\ ... ") หรือไม่ สิ่งที่แย่ที่สุดคือคุณสามารถแก้ไขค่า Registry โดยตรงหลังจากนั้นถ้า SC.EXE ไม่สามารถทำได้