Подтвердить что ты не робот

Уровень ошибок в цикле For (пакетные окна)

У меня есть следующий пакетный код окон:

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

Но он не работает, как я ожидаю.

Все имена процессов iidbms, iigcc, iigcd, dmfacp, dmfrcp, rmcmd являются реальными, и они найдены, вместо этого qwerty является изобретенным и не должен его находить, поэтому должен печатать "не найден процесс 1" , но это не так, оно всегда печатает 0.

Но я заметил, что если я запустил tasklist | findstr /i qwerty из приглашения dos, сразу после того, как будет %errorlevel%= 1.

Какой ответ может быть или лучше?

4b9b3361

Ответ 1

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

Ответ 2

Добавить

setlocal EnableDelayedExpansion

в начало вашего script, затем используйте !errorlevel! вместо %errorlevel%

Отложенное расширение приведет к тому, что переменные будут расширены при выполнении времени, а не во время разбора

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

Ответ на другой вопрос, который указал мне в правильном направлении: fooobar.com/questions/283619/...

Ответ 3

Вы можете использовать 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