簡體   English   中英

For循環中的Errorlevel(批處理窗口)

[英]Errorlevel in a For loop (batch windows)

我有以下Windows批處理代碼:

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%)
)

但它沒有像我期望的那樣起作用。

所有名稱進程iidbmsiigcciigcddmfacpdmfrcprmcmd都是真實的,並且找到了它們,而qwerty是一個發明的,不應該找到它,所以應該打印“no process found 1” ,但它不會,它總是打印0。

但我注意到的是,如果我運行tasklist | findstr /i qwerty 來自dos提示符的tasklist | findstr /i qwerty ,就在%errorlevel% = 1之后。

什么樣的答案可能或更好?

setlocal EnableDelayedExpansion

到你的腳本開始,然后使用!errorlevel! 而不是%errorlevel%

延遲擴展將導致變量在執行時而不是在解析時擴展

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

另一個問題的答案指出了我正確的方向: https//stackoverflow.com/a/6658935/10245

如果返回碼等於或高於指定的errorlevel,則IF ERRORLEVEL返回TRUE。 在您的示例中,由於0小於1,因此如果實際錯誤代碼為0或更高,則第一個errorlevel語句將始終為true。 你想要的是首先測試errorlevel 1。

例如:

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
)

另一個問題是,如果要在for循環內回顯實際的錯誤級別。 由於變量在循環開始之前被解析,因此回顯%errorlevel%將始終回顯0.如果要在執行時回顯該值,則需要修改代碼段,如下所示:

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!
)

你可以使用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:\test>cscript //nologo test.vbs explorer spool svchost
found:svchost
found:svchost
found:svchost
found:svchost
found:svchost
found:explorer
found:svchost
found:spool

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM