Я попытался найти приложение по имени myapp
непосредственно из командной строки и из пакетного скрипта, выполнив следующую команду:
D:\Files>wmic process where "commandline like '%myapp%'" get processid, commandline
CommandLine ProcessId
wmic process where "commandline like '%myapp%'" get processid, commandline 10744
myapp myarg1 myarg2 myarg3 2423
Я хочу отфильтровать саму запись процесса wmic
. Я попробовал следующую команду:
D:\Files>wmic process where "commandline like '%myapp%' and commandline not like '%wmic%'" get processid, commandline
Node - XXXXXXXXXXX
ERROR:
Description = Invalid query
Но он выводит ошибку, как показано выше.
Я пытался вручную пропустить первую строку с помощью more +1
, но может случиться так, что порядок строк вывода (процессов) изменится.
Что можно сделать, чтобы удалить запись процесса wmic
?
Укажите любой символ в диапазоне, заключив его в квадратные скобки []
.
Используя пример java
в ваших комментариях:
В batch-file
(двойной %%
для аналогичного утверждения)
@echo off
wmic process where "commandline like '%%[m]y-complex-application.jar%%'" get processid, commandline
в cmd
(один %
для подобного утверждения)
wmic process where "commandline like '%[m]y-complex-application.jar%'" get processid, commandline
Почему это работает
[]
указывает диапазон символов, которые должны или могут быть сопоставлены. Например, при выполнении ... like '%[abc]md%
он будет соответствовать всему, что связано с amd
, bmd
и cmd
. Хитрость здесь в том, что символ внутри []
сопоставляется как буквальный символ, а не с []
. Таким образом, в случае, когда мы ищем [m]yapp
, он буквально преобразует строку, чтобы найти именно слово myapp
, однако ваше утверждение wmic
s like
вообще не содержит этого слова, оно содержит слово [m]yapp
и не будет соответствовать ему.
Потом немного бесполезной информации. Этот трюк также работает для команды grep
Linux, а также для Windows findstr
пример (findstr
):
echo myapp | findstr /R "[m]yapp"
результат:
пример (Linux' grep
):
ps -ef | grep "[t]nslsnr"
Результат с []
и без
Правильный способ запуска вашей конкретной команды и возврата только тех экземпляров, которые вам нужны, непосредственно в команда, заключается в следующем:
wmic process where "commandline like '%myapp%' and not commandline like 'wmic%'" get processid, commandline
Идея этого механизма состоит в том, чтобы исключить саму командную строку wmic. Он делает это, запрашивая командные строки, которые содержат где угодно строку myapp
, но не включают командные строки, начинающиеся со строки wmic
.
Если эта команда запускается в пакетный файл, символы процента потребуют удвоения, т.е.
wmic process where "commandline like '%%myapp%%' and not commandline like 'wmic%%'" get processid, commandline