2010-05-20 6 views
21

Tôi đang sử dụng tệp lô để dừng dịch vụ Windows. Tôi đang sử dụng lệnh sc, nhưng tôi mở cho các ý tưởng khác, được đưa ra câu hỏi bên dưới. Vấn đề là các tập tin thực thi tiến hành khi dịch vụ này được dừng lại (các stop lập luận để sc dường như chỉ để yêu cầu điểm dừng chân - nó không chờ cho điểm dừng).Dừng tệp hàng loạt cho đến khi dừng dịch vụ hoàn tất?

Làm cách nào để sửa đổi tệp lô thành không tiếp tục cho đến khi dừng là hoàn thành?

Trả lời

25

Sử dụng có thể sử dụng NET stop, đồng bộ hóa, tức là nó sẽ đợi cho đến khi dịch vụ dừng.

Xem - NET stop

+1

stop' Tuy nhiên 'net sẽ ném một lỗi chung mã số 2 (access denied) nếu dịch vụ đã được dừng lại. – Wernight

+27

Điều này không hoàn toàn chính xác. Nếu dịch vụ mất, nói 4 phút, để thực sự hoàn toàn dừng và thoát, lệnh "net stop" sẽ trở lại sau 20-40 giây, nhưng quá trình dịch vụ vẫn chưa chấm dứt. Nó trả về "Dịch vụ không thể dừng lại" ... nhưng điều này là gây hiểu lầm. Dịch vụ HAS đã được gửi một lệnh dừng, nhưng chỉ không thoát khỏi tất cả các con đường trong thời gian chờ SCM. – Jonesome

2

Tôi tin net stop [Service] nên đợi cho đến khi dịch vụ đã ngừng hoàn toàn trước khi chuyển. sc stop [Service] chỉ cần gửi thông báo "dừng" tới dịch vụ.

+1

Không hoàn toàn chính xác. Xin vui lòng xem bình luận của tôi ở trên. – Jonesome

+0

@Jonesome - thay vì downvoting, tại sao không cung cấp câu trả lời tốt hơn? – LittleBobbyTables

+0

cuộc gọi công bằng! Làm xong! Lý do để downvote là cả hai câu trả lời đều chứa thông tin sai (tôi đã thử nghiệm trên win7 và win2008, và biết từ kinh nghiệm rằng XP và vers khác sẽ hành xử giống nhau). – Jonesome

11

Như đã đề cập ở trên, NET STOP sẽ gửi lệnh dừng cho dịch vụ, nhưng nếu dịch vụ mất nhiều hơn một khoảng thời gian nhất định (khoảng 20 giây là quan sát của tôi), NET STOP sẽ KHÔNG đợi dịch vụ thực sự dừng lại trước khi trở về.

Để thực sự dừng lại tập tin thực thi cho đến khi dịch vụ dừng lại, bạn cần phải sử dụng một cách tiếp cận như những phác thảo trong các chủ đề:

How to check if a service is running via batch file and start it, if it is not running?

Stopping/Starting a remote Windows service and waiting for it to open/close

+0

Không phải là downvoter (mặc dù tôi có thể đoán ai là), nhưng câu trả lời này là * cũng * chứa thông tin sai. 'NET STOP' * sẽ * đợi cho dịch vụ dừng lại, tới một điểm. Tôi đã không bao giờ có một dịch vụ cố gắng dừng lại trong toàn bộ bốn phút, vì vậy tôi không thể nói bao lâu 'NET STOP' chờ đợi, nhưng nó * * chờ đợi một khoảng thời gian khá, trái ngược với' sc stop'. \ – LittleBobbyTables

+0

@LittleBobbyTables Bài đăng đã được cập nhật cho tài khoản về những gì bạn quan sát. Nếu bạn nhìn vào những gì mà nhóm microsoft viết (link bên dưới), bạn sẽ thấy rằng SCM chỉ nói chuyện với một dịch vụ tại một thời điểm, vì vậy nó sẽ không chờ đợi mãi mãi cho bất kỳ dịch vụ nào. NET GỬI chỉ là một cách để gửi một cmd đến SCM, giống như trong quản lý dịch vụ. http://blogs.msdn.com/b/bclteam/archive/2009/02/19/in-depth-how-net-managed-services-interact-with-the-servicecontrolmanager-scm-kim-hamilton.aspx – Jonesome

+0

Kéo thêm một chút thông tin từ blog được liên kết bởi @Jonesome: khoá đăng ký kiểm soát thời gian chờ là 'HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Control \ WaitToKillServiceTimeout'. Mặc định là 20 giây, nhưng là 5 giây trên hộp Windows 8.1 Enterprise của tôi (có khả năng bị thay đổi bởi chính sách nhóm). – Stajs

1

Đây là một thô chút nhưng nó làm việc cho tôi để đảm bảo rằng tôi có thể lên lịch một tập tin batch hàng ngày về cơ bản RESTART một dịch vụ.

DỪNG

NET [Dịch vụ]

: TRYAGAIN

TIMEOUT/T 10/NOBREAK

NET START [Dịch vụ]

NẾU% ERRORLEVEL% NEQ 0 GOTO TRYAGAIN

Tôi nhận ra rằng đoạn mã này có thể dẫn đến vòng lặp vô tận nếu dịch vụ không khởi động thành công. Tôi chỉ muốn về cơ bản cho thấy làm thế nào để có được xung quanh vấn đề bằng cách sử dụng TIMEOUT nơi một dịch vụ có thể mất nhiều thời gian để ngăn chặn hơn những gì lệnh NET STOP cho phép.

8
sc stop webdriveservice 
:loop 
sc query webdriveservice | find "STOPPED" 
if errorlevel 1 (
    timeout 1 
    goto loop 
) 
0

Sử dụng biểu tượng && giữa các lệnh. Biểu tượng && chờ kết thúc lệnh trước đó trước khi chuyển sang lệnh tiếp theo.

Tất cả các lệnh phải ở cùng một dòng lệnh. Bạn có thể sử dụng bao nhiêu lệnh bạn muốn trong một hàng.

Bạn cũng có thể sử dụng lệnh pause. Với điều này, yêu cầu nhấn phím bất kỳ, trước khi tiến hành thủ tục tiếp theo.

Ví dụ:

sc qdescription "MyServiceName" && echo. && sc stop "MyServiceName" && echo. && echo   [ "MyServiceName" service stopped ] && echo. && pause