2010-10-15 26 views
19

tôi có các cửa sổ đang thực thi sau:ERRORLEVEL trong một Đối với loop (cửa sổ batch)

for %%i in (iidbms iigcc iigcd dmfacp dmfrcp rmcmd qwerty) do (
    tasklist | findstr /i %%i 
    echo %errorlevel% 
    if %errorlevel% == 0 (echo %%i ok process found %errorlevel%) 
    if %errorlevel% == 1 (echo %%i no process found %errorlevel%) 
) 

Nhưng nó không hoạt động như tôi mong đợi.

Tất cả tên các quá trình iidbms, iigcc, iigcd, dmfacp, dmfrcp, rmcmd là có thật, và chúng được tìm thấy, thay vì qwerty là một phát minh một và không nên tìm thấy nó, vì vậy nên in "không tìm thấy quá trình 1", nhưng nó không luôn luôn in 0.

Nhưng điều tôi đã lưu ý là nếu tôi chạy tasklist | findstr /i qwerty từ lời nhắc dos, ngay sau khi có %errorlevel% = 1.

Câu trả lời nào có thể tốt hơn?

Trả lời

21

NẾU ERRORLEVEL trả về TRUE nếu mã trở lại là bằng hoặc cao hơn so với errorlevel quy định. Trong ví dụ của bạn, vì 0 thấp hơn 1, câu lệnh errorlevel đầu tiên sẽ luôn đúng nếu mã lỗi thực tế là 0 hoặc cao hơn. Những gì bạn muốn là để kiểm tra cho errorlevel 1 đầu tiên.

ví dụ .:

for %%i in (iidbms iigcc iigcd dmfacp dmfrcp rmcmd qwerty) do (
    tasklist | findstr /i %%i 
    if errorlevel 0 if not errorlevel 1 echo process 
    if errorlevel 1 if not errorlevel 2 echo process not found 
) 

Một vấn đề khác là nếu bạn muốn echo errorlevel thực tế từ bên trong vòng lặp for. Kể từ khi các biến được giải quyết trước khi bắt đầu vòng lặp, lặp% errorlevel% sẽ luôn vang 0. Nếu bạn muốn để echo giá trị tại thời gian thực hiện, bạn cần phải sửa đổi các đoạn mã như sau:

setlocal enabledelayedexpansion 
for %%i in (iidbms iigcc iigcd dmfacp dmfrcp rmcmd qwerty) do (
    tasklist | findstr /i %%i 
    if errorlevel 0 if not errorlevel 1 echo %%i ok process found !errorlevel! 
    if errorlevel 1 if not errorlevel 2 echo %%i no process found !errorlevel! 
) 
+0

tôi đã đảo ngược trật tự (lần đầu tiên 1 thì 0) nhưng resul là giống nhau – aemme

+0

Nếu bạn không thay đổi mã đã đăng, thì bạn cần một goto sau khi lỗi của bạn 1 để bỏ qua câu lệnh tiếp theo hoặc thay đổi điều kiện của bạn (sử dụng NEQ, v.v.). – JRL

+0

một số ví dụ ...? – aemme

0

Bạn có thể sử dụng VBScript,

NumArgs = WScript.Arguments.Count 
strComputer="." 
Set objWMIService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2") 
Set colProcessList = objWMIService.ExecQuery("Select * from Win32_Process") 
For Each objProcess in colProcessList 
    For i=0 To NumArgs-1 
     If InStr(objProcess.Name ,WScript.Arguments(i) ) > 0 Then 
      WScript.Echo "found:" & WScript.Arguments(i) 
     End If 
    Next 
Next 

Cách sử dụng:

C:\test>cscript //nologo test.vbs explorer spool svchost 
found:svchost 
found:svchost 
found:svchost 
found:svchost 
found:svchost 
found:explorer 
found:svchost 
found:spool 
23

Thêm

setlocal EnableDelayedExpansion 

khi bắt đầu kịch bản của bạn, sau đó sử dụng !errorlevel! thay vì %errorlevel%

Expansion trễ sẽ gây ra các biến để được mở rộng tại execu tion thời gian chứ không phải là lúc phân tích cú pháp

~ http://ss64.com/nt/delayedexpansion.html

Câu trả lời cho một câu hỏi mà chỉ cho tôi đi đúng hướng: https://stackoverflow.com/a/6658935/10245

Các vấn đề liên quan