как установить% подстановочных знаков в начале wmic внутри для для в пакетном файле - PullRequest
0 голосов
/ 17 мая 2019

Я получаю странное поведение, вызывая wmic внутри командного файла, я пытаюсь получить идентификатор процесса, но когда я устанавливаю %% в начале строки в команде like, он возвращает случайные числа, но когда я использую их в конце, его поведение нормальное

Я пробовал %%,%, ^%, \%, и ни один из них не работает. все, что я прочитал, указывает, что мне нужно экранировать%, используя %%, но я не могу заставить его работать в начале строки

    @echo off
    setlocal EnableDelayedExpansion
    FOR /F %%i in ('dir /b/a-d/od/t:c omcp_*.log') do set "FILENAME=%%i"
    FOR /F "usebackq" %%A IN ('%FILENAME%') DO set "SIZE=%%~zA"
    set commie=0
    IF DEFINED LASTFILENAME (
        IF "%FILENAME%" == "%LASTFILENAME%" (
            if DEFINED LASTSIZE (
                IF "%SIZE%"=="%LASTSIZE%" ( 
->->->                        for /f "UseBackQ tokens=2 delims==" %%f in (`wmic PROCESS WHERE "COMMANDLINE LIKE '%%winlog%%'" GET ProcessID /value ^| find "="`) do set "commie=%%f"
                    echo !commie!
                    IF !commie! equ 0 echo "subir monitor"
                    ) else ( 
                        echo "re subir monitor" 
                )
            )
        )
    )

    set LASTFILENAME=%FILENAME%
    set LASTSIZE=%SIZE%

    REM setx LASTFILENAME FILENAME
    REM setx LASTSIZE SIZE

когда я использую только последний %%, он работает и возвращает идентификатор процесса winlogon, и это должно произойти, если я использую start %%, фактический результат является случайным, по крайней мере, я думаю, что это случайные числа; например: 8260,11576,8596, и это не зависит от искомого значения

1 Ответ

0 голосов
/ 18 мая 2019

Это ответ на вашу конкретную проблему, он не имеет отношения к другим проблемам с вашим кодом, см. Мой комментарий или не учитывает, выполнит ли общая задача, как вы собираетесь, после ее решения это к.

Кроме проблемной проблемы с завершением строки , также подразумеваемой в комментариях , необходимо учитывать тот факт, что при запуске команды 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. Если любой из этих двух вариантов возможен, то вся ваша методология нуждается в переосмыслении.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...