ฉันจะเริ่มบริการ Windows จากสคริปต์ได้อย่างไร


38

ฉันมีสคริปต์ชุดที่ดูเหมือนว่า:

sc stop myservice
sc start myservice

มันเกิดข้อผิดพลาดเนื่องจาก sc ไม่รอจนกระทั่งบริการหยุดทำงาน ฉันจะเริ่มบริการด้วยสคริปต์ได้อย่างไร


แล้วเรื่องนี้ล่ะ
pQd

คำตอบ:


47

โปสเตอร์ต้องการให้แน่ใจว่าบริการหยุดทำงานก่อนที่จะพยายามเริ่มบริการใหม่ คุณสามารถใช้การวนซ้ำกับผลลัพธ์ของ "sc query" ทำสิ่งนี้:

:stop
sc stop myservice

rem cause a ~10 second sleep before checking the service state
ping 127.0.0.1 -n 10 -w 1000 > nul

sc query myservice | find /I "STATE" | find "STOPPED"
if errorlevel 1 goto :stop
goto :start

:start
net start | find /i "My Service">nul && goto :start
sc start myservice

8
ใช้ดี ping เป็นเวลาหน่วง
David Yu

ขอขอบคุณที่มีนอนในชุดไม่มีดังนั้นนั่นคือทั้งหมดที่คุณสามารถทำได้เพื่อรอ :)
CRB

4
+1 และตรา GOTO มอบให้กับผู้ที่ใช้คำสั่ง GOTO ที่มีหน้าตรง
โจเซฟ Kern

หากรองรับเฉพาะชุดทำ / ในขณะที่ลูป ... มันเป็นเรื่องเล็กน้อยใน C # จริงๆ!
crb

3
ใน Windows Server 2008 ระดับข้อผิดพลาดคือ0เมื่อพบและ1เมื่อไม่พบ ดังนั้นฉันจึงต้องกลับเหตุผลและใช้งานได้
Kirk Woll

26

อาจจะหายไปบางสิ่งบางอย่าง แต่ฉันใช้มันตลอดเวลา:

net stop "myservice"
net start "myservice"

หรือสั้นกว่า:

net stop "myservice" && net start "myservice"


24

ง่ายตายด้วย powershell:

PS >Restart-Service MySrvcHere

ยิ่งกว่านั้นการใช้ชื่อที่แสดง:

PS >Restart-Service -displayname "My Service Name Here"

Get-Help Restart-Service มากขึ้น


6

หากเป็นเพียงการรีสตาร์ทบริการคุณสามารถใช้

Net stop myservice
Net start myservice

อย่างไรก็ตามหากคุณต้องการเข้าถึงตัวเลือกของ sc คุณสามารถใช้คำสั่ง start / wait

start /B /WAIT CMD /C "sc stop myservice"
start /B /WAIT CMD /C "sc start myservice"

เทคนิคนี้เป็นวิธีแก้ปัญหาทั่วไปที่สามารถใช้กับคำสั่งใด ๆ


sc stop myserviceจะเพิ่งส่งคำสั่งหยุดและกลับก่อนที่บริการจะหยุด โทร sc กับ start / b จะไม่ช่วย
Jürgen Steinblock

5

หากต้องการให้เริ่มบริการบางอย่างอย่างเงียบๆ ซึ่งขอให้ยืนยันการหยุด (เช่นบริการเซิร์ฟเวอร์เป็นต้น) คุณสามารถเพิ่ม/ yไปยังคำสั่ง end of stop

net stop Server /y
net start Server

มันจะมีประโยชน์สำหรับการเรียกใช้สคริปต์อัตโนมัติ


3

หากคุณต้องการเริ่มบริการที่ล้มเหลวคุณไม่จำเป็นต้องเรียกใช้สคริปต์ ในบริการ MMC snapin คลิกขวาที่บริการเลือกคุณสมบัติคลิกแท็บการกู้คืน ที่นี่คุณสามารถตั้งค่าการกระทำที่คุณต้องการหากบริการหยุด มีความยืดหยุ่นมาก คุณจะต้องมีสคริปต์หากคุณพยายามหยุดบริการทำสิ่งใดสิ่งหนึ่งแล้วเริ่มสคริปต์นำหน้าชุดไฟล์ด้วยnet stop "myserviceshortname"และจบด้วยnet start "myserviceshortname"

ใน vbscipt มันเป็นรหัสอีกเล็กน้อยที่จะหยุดการบริการและ 'ผู้ติดตาม:

strComputer = "."
Set objWMIService = GetObject("winmgmts:" _
    & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
Set colServiceList = objWMIService.ExecQuery("Associators of " _
   & "{Win32_Service.Name='myservice'} Where " _
        & "AssocClass=Win32_DependentService " & "Role=Antecedent" )
For each objService in colServiceList
    objService.StopService()
Next
Wscript.Sleep 20000
Set colServiceList = objWMIService.ExecQuery _
        ("Select * from Win32_Service where Name='myservice'")
For each objService in colServiceList
    errReturn = objService.StopService()
Next

นี่คือการเริ่มบริการและทุกสิ่งที่มันขึ้นอยู่กับ (ควรจะคุ้นเคย)

strComputer = "."
Set objWMIService = GetObject("winmgmts:" _
    & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
Set colServiceList = objWMIService.ExecQuery _
    ("Select * from Win32_Service where Name='Myservice'")
For each objService in colServiceList
    errReturn = objService.StartService()
Next
Wscript.Sleep 20000
Set colServiceList = objWMIService.ExecQuery("Associators of " _
   & "{Win32_Service.Name='myservice'} Where " _
        & "AssocClass=Win32_DependentService " & "Role=Dependent" )
For each objService in colServiceList
    objService.StartService()
Next

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.