Batch file không xử lý biến trong vòng lặp for


0

Tôi đã làm việc để cải thiện tập tin lô này. Mục tiêu của tôi là cho nó dừng dịch vụ đầu tiên trong danh sách và đợi cho đến khi nó dừng hoàn toàn hoặc giết nó nếu nó không dừng nhanh, sau đó khởi động lại và đợi cho đến khi dịch vụ được khởi động hoàn toàn trước khi dừng dịch vụ tiếp theo trong danh sách.

Như trong ví dụ này, đầu tiên nó ghi tên của từng dịch vụ vào một tệp, sau đó đọc chúng. Nên đặt chúng vào %% một trường nhưng thay vào đó, nó đặt Service_% a làm tên của dịch vụ và sau đó không thành công.

Làm thế nào tôi có thể thay đổi nó để nó đọc đúng tên?

@ECHO OFF
SETLOCAL EnableDelayedExpansion
ECHO ---------------------------------------------->> log.txt
ECHO -----------========================----------->> log.txt
ECHO -----------=========%date%=========----------->> log.txt
ECHO -----------========================----------->> log.txt
ECHO ---------------------------------------------->> log.txt

set DD=0
Set TIMESTAMP="eol=; tokens=1,2,3,4* delims=/, "
For /F %TIMESTAMP% %%i in ('DATE /t') DO (
  SET YYYYMMDD=%%l%%j%%k
  SET YYYYMM=%%l%%j
  set DD=%%k
)

echo 3050 >> services
echo 3051 >> services
echo 3052 >> services

for /f %%a in (services) do (
  set timestamp=!date!!time!
  ECHO !timestamp! - Stopping Service %%a >> log.txt
  sc stop Service_%%a >> log.txt
  timeout /t 15 > NUL
  for /f "tokens=4" %%s in ('sc query "Service_%%a" ^| find "STATE"') do if NOT "%%s"=="STOPPED" goto ForceStop
  goto Start

  :ForceStop
  ECHO !timestamp! - Service could not be stopped, forcing... >> log.txt
  taskkill /f /im Service_%%a.exe >> log.txt

  :Start
  ECHO !timestamp! - Service is stopped >> log.txt

  timeout /t 5 > NUL

  set timestamp=!date!!time!
  ECHO !timestamp! - Starting Service %%a >> log.txt
  sc start "Service_%%a" >> log.txt

  :WAIT
  ECHO !timestamp! - Service not yet started >> log.txt
  timeout /t 5 > NUL
  for /f "tokens=4" %%s in ('sc query "Service_%%a" ^| find "STATE"') do if NOT "%%s"=="RUNNING" goto WAIT
  ECHO !timestamp! - Service is started >> log.txt  
)
if exist services del services

Câu trả lời:


0
echo 3050 >> services
         ^              remove this evil space

bởi vì mặc dù sc query "Service_3050" có thể làm việc, sc query "Service_3050 " với không gian bổ sung đó sẽ gây ra lỗi tiếp theo:

[SC] EnumQueryServicesStatus:OpenService FAILED 1060:

The specified service does not exist as an installed service.

Có cái khác nghiêm trọng lỗi trong mã của bạn: sử dụng :label phía trong một ( khối mã trong ngoặc đơn ) sẽ phá vỡ một for bối cảnh vòng lặp. Sử dụng call :label thay vì như sau:

for /f %%a in (services) do (
  set timestamp=!date!!time!
  ECHO !timestamp! - Stopping Service %%a >> log.txt
  sc stop Service_%%a >> log.txt
  timeout /t 15 > NUL
  for /f "tokens=4" %%s in ('
        sc query "Service_%%a" ^| find "STATE"
        ') do if NOT "%%s"=="STOPPED" CALL :ForceStop "%%a%

  ECHO !timestamp! - Service is stopped >> log.txt

  timeout /t 5 > NUL

  set timestamp=!date!!time!
  ECHO !timestamp! - Starting Service %%a >> log.txt
  sc start "Service_%%a" >> log.txt

    call :WAIT "%%a%
)
goto :done

:WAIT
ECHO !timestamp! - Service not yet started >> log.txt
timeout /t 5 > NUL
for /f "tokens=4" %%s in ('
    sc query "Service_%~1" ^| find "STATE"
    ') do if NOT "%%s"=="RUNNING" goto :WAIT
ECHO !timestamp! - Service is started >> log.txt  
exit /B

:ForceStop
ECHO !timestamp! - Service could not be stopped, forcing... >> log.txt
taskkill /f /im Service_%~1.exe >> log.txt
exit /B

:done
if exist services del services

Tài nguyên (yêu cầu đọc):


OK, điều này đã cho tôi gần hơn rất nhiều. Bây giờ vấn đề tôi gặp phải là bên ngoài vòng lặp for, giá trị từ tệp dịch vụ không được thực hiện. Dịch vụ %% a đang hiển thị dưới dạng Dịch vụ% a bên ngoài vòng lặp đầu tiên.
Brian Henson

@BrianHenson Mea culpa, mea culpa, mea maxima culpa!
JosefZ
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.