Làm cách nào để khởi động lại dịch vụ Windows từ tập lệnh?


38

Tôi có một tập lệnh trông giống như:

sc stop myservice
sc start myservice

nó báo lỗi vì sc không đợi đến khi dịch vụ bị dừng. Làm cách nào để khởi động lại dịch vụ với tập lệnh?


cái này thì sao
pQd

Câu trả lời:


47

Người đăng muốn đảm bảo dịch vụ bị dừng trước khi thử khởi động lại. Bạn có thể sử dụng một vòng lặp trên đầu ra của "sc query" để làm một cái gì đó như thế này:

: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
Đẹp sử dụng ping như một sự chậm trễ thời gian.
David Yu

Cảm ơn, không có giấc ngủ theo đợt nên đó là tất cả những gì bạn có thể làm để chờ đợi :)
crb

4
+1 và huy hiệu GOTO. Được trao cho những người sử dụng tuyên bố GOTO với khuôn mặt thẳng.
Joseph Kern

Nếu chỉ hỗ trợ hàng loạt các vòng lặp do / while ... Thật là tầm thường trong C #, thật đấy!
crb

3
Trong Windows Server 2008, mức lỗi là 0 khi tìm thấy và 1 khi không tìm thấy. Vì vậy, tôi đã phải đảo ngược logic và sau đó nó hoạt động.
Kirk Woll

26

Có thể thiếu một cái gì đó, nhưng tôi sử dụng tất cả các thời gian:

dừng net "myservice"
bắt đầu ròng "myservice"

hoặc ngắn hơn:

dừng mạng "myservice" && net bắt đầu "myservice"


24

Chết đơn giản với powershell:

PS >Restart-Service MySrvcHere

Thậm chí tốt hơn, sử dụng tên hiển thị:

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

Get-Help Restart-Service để biết thêm


6

Nếu đó hoàn toàn là để khởi động lại dịch vụ, bạn có thể sử dụng

Net stop myservice
Net start myservice

Tuy nhiên, nếu bạn muốn truy cập vào các tùy chọn của sc, bạn có thể sử dụng lệnh start / Wait

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

kỹ thuật này là một giải pháp tổng quát hơn có thể được áp dụng cho bất kỳ lệnh nào.


sc stop myservicesẽ chỉ gửi lệnh dừng và quay lại trước khi dịch vụ bị dừng. Gọi sc với start / b sẽ không giúp được gì.
Jürgen Steinblock

5

Để khởi động lại yên tĩnh một số dịch vụ, yêu cầu dừng xác nhận (ví dụ như dịch vụ Máy chủ), Bạn có thể thêm / y vào cuối lệnh dừng.

net stop Server /y
net start Server

Nó sẽ hữu ích cho việc thực thi kịch bản tự động.


3

Nếu bạn muốn khởi động lại một dịch vụ thất bại, bạn không cần phải chạy tập lệnh. Trong dịch vụ MMC snapin nhấp chuột phải vào một dịch vụ, chọn thuộc tính, nhấp vào tab khôi phục. Tại đây bạn có thể thiết lập những hành động bạn muốn thực hiện khi dịch vụ dừng lại. Có rất nhiều tính linh hoạt có sẵn. Bạn sẽ cần một tập lệnh nếu bạn đang cố gắng dừng dịch vụ, làm một cái gì đó sau đó khởi động tập lệnh, mở đầu tập tin bó net stop "myserviceshortname"và kết thúc bằngnet start "myserviceshortname"

Trong vbscipt, cần thêm một chút mã để dừng dịch vụ và 'người phụ thuộc của nó:

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

Đây là bắt đầu một dịch vụ và bất cứ điều gì nó phụ thuộc vào (điều này nên quen thuộc)

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

1

Bạn có thể sử dụng các lệnh sau:

@echo off
sc Stop <Name of Agentry Service Here>
timeout 30
sc start <Name of Agentry Service Here>
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.