Как найти точное совпадение, используя PSLIST и FIND в Batch/CMD

Я пытаюсь найти работающий процесс и уничтожить его с помощью PSLIST и PSKILL, однако мне не удается правильно установить уровень ошибок. В зависимости от того, как я это делаю, он застревает либо в 0, либо в 1. У меня изначально был код, работающий с командами Taskkill и Tasklist, но код должен работать как в Windows 2000, так и в XP.

У меня также работает notepad++ для редактирования командного файла. Следующий код не различает notepad++ или notepad.exe.

@echo off

reg.exe ADD "HKCU\Software\Sysinternals\PsKill" /v EulaAccepted /t REG_DWORD /d 1 /f >NUL
reg.exe ADD "HKCU\Software\Sysinternals\PsList" /v EulaAccepted /t REG_DWORD /d 1 /f >NUL

rem just to see output of pslist
PSLIST "notepad" 2>NUL
ECHO.
ECHO. 
PSLIST "notepad" 2>NUL | FIND /I /N "notepad"
echo The error level is %errorlevel%


IF %errorlevel% EQU 0 (
    ECHO Notepad is running and will be terminated.
    ECHO.
    PSKILL "notepad.exe" 2>NUL
)
IF %errorlevel% EQU 1 (
    ECHO Notepad was not running.
    ECHO Starting Notepad now...
    ECHO.
    start "" "notepad.exe"
)

Pause
EXIT

Приведенный выше код застревает на 0. Когда я меняю строку с командой FIND на FINDSTR как PSLIST "notepad" 2>NUL | FINDSTR /I /N "notepad.exe" тогда он застревает на 1.

Есть ли способ получить команды PSLIST и FIND или FINDSTR для возврата правильного уровня ошибки с точным соответствием?

2 ответа

Решение

Как насчет использования -e параметр pslist?

pslist -e notepad

Он установит errorlevel в 0, когда найден, и в 1, если не найден. Также это точное совпадение, означающее, что он не будет идентифицировать notepad++.

Справка PSList

pslist v1.3 - Sysinternals PsList
Copyright (C) 2000-2012 Mark Russinovich
Sysinternals - www.sysinternals.com

Usage: pslist [-d][-m][-x][-t][-s [n] [-r n] [\\computer [-u username][-p password][name|pid]
   -d          Show thread detail.
   -m          Show memory detail.
   -x          Show processes, memory information and threads.
   -t          Show process tree.
   -s [n]      Run in task-manager mode, for optional seconds specified.
               Press Escape to abort.
   -r n        Task-manager mode refresh rate in seconds (default is 1).
   \\computer  Specifies remote computer.
   -u          Optional user name for remote login.
   -p          Optional password for remote login. If you don't present
               on the command line pslist will prompt you for it if necessary.
   name        Show information about processes that begin with the name
               specified.
   -e          Exact match the process name.
   pid         Show information about specified process.

All memory values are displayed in KB.
Abbreviation key:
   Pri         Priority
   Thd         Number of Threads
   Hnd         Number of Handles
   VM          Virtual Memory
   WS          Working Set
   Priv        Private Virtual Memory
   Priv Pk     Private Virtual Memory Peak
   Faults      Page Faults
   NonP        Non-Paged Pool
   Page        Paged Pool
   Cswtch      Context Switches

Попробуйте это (отображает только интересную строку):

PSLIST "notepad++" 2>NUL | FINDstr /I "notepad++"
echo %errorlevel%
PSLIST "notepad" 2>NUL | FINDstr /I "notepad[^+]"
echo %errorlevel%
Другие вопросы по тегам