Это ответ на вашу конкретную проблему, он не имеет отношения к другим проблемам с вашим кодом, см. Мой комментарий или не учитывает, выполнит ли общая задача, как вы собираетесь, после ее решения это к.
Кроме проблемной wmic проблемы с завершением строки , также подразумеваемой в комментариях , необходимо учитывать тот факт, что при запуске команды WMIC
вы вы делаете это с включенной строкой winlog
Это означает, что процесс wmic.exe
CommandLine
будет соответствовать строке winlog
, и вам нужно будет отфильтровать это. Однако это усложняется тем, что заключенная в скобки команда WMIC
для For
также запускается в отдельном экземпляре cmd.exe
, поэтому процесс cmd.exe
CommandLine
будет содержать команду WMIC
и, следовательно, строку winlog
тоже. Поэтому вам необходимо дополнительно отфильтровать это в вашей команде WMIC
.
Таким образом, из трех ProcessID
выходов, которые вы указали в своем вопросе, 8260
, 11576
и 8596
один предназначен для процесса winlogon
, один - cmd.exe
, а другой - для процесса wmic.exe
.
Поэтому я бы предложил вам изменить указанную проблемную строку на:
For /F EOL^=P %%A In ('WMIC Process Where "Name<>'cmd.exe' And Name<>'wmic.exe' And CommandLine Like '%%winlog%%'" Get ProcessID 2^>Nul')Do For %%B In (%%A)Do Set "commie=%%B"
Я обычно предпочитаю использовать !=
, или этот формат, Not Name=
, но, поскольку вы включили отложенное расширение, я решил держаться подальше от восклицательных знаков, выбрав более короткую альтернативу <>
.
Обратите внимание, что в этом ответе нельзя ожидать выделения конкретного экземпляра CommandLine
, если существует более одного процесса сопоставления. Также не учитывается вероятность того, что ваша цель CommandLine
, содержащая строку winlog
, могла быть запущена через другой экземпляр cmd.exe
. Если любой из этих двух вариантов возможен, то вся ваша методология нуждается в переосмыслении.