25

我有以下 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 提示符运行,就在%errorlevel%= 1 之后。

什么样的答案可能是或更好的是?

4

3 回答 3

35

添加

setlocal EnableDelayedExpansion

到脚本的开头,然后使用 !errorlevel!而不是%errorlevel%

延迟扩展将导致变量在执行时而不是在解析时扩展

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

另一个问题的答案为我指明了正确的方向:https ://stackoverflow.com/a/6658935/10245

于 2012-07-27T16:35:07.943 回答
31

如果返回代码等于或高于指定的错误级别,则 IF ERRORLEVEL 返回 TRUE。在您的示例中,由于 0 小于 1,因此如果实际错误代码为 0 或更高,则第一个 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!
)
于 2010-10-15T13:04:37.090 回答
0

你可以使用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
于 2010-10-15T13:03:25.697 回答