如何在批处理文件中的 for 内的 wmic 开头设置 % 通配符

how to set % wildacards at the beginning of a wmic inside a for in a batch file

我在批处理文件中调用 wmic 时出现奇怪的行为,我试图获取进程的 ID,但是当我在 like 命令中的字符串开头设置 %% 时,它 returns 随机数,但是当我最后使用它们时,它的行为是正常的

我已经尝试了 %%、%、^%、\% 和 none 的方法。我读过的所有内容都表明我需要使用 %% 来转义 % 但我无法让它在字符串的开头工作

    @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

当我只使用最后的 %% 和 return winlogon 进程的 id 时,如果我使用 start %% 应该会发生这种情况,实际输出是随机的,至少我认为是随机的,数字;对于 example:8260,11576,8596 这与搜索的值无关

这是对您的具体问题的回答,它不涉及您代码的其他问题,请参阅我的评论,或者考虑一下,一旦修复,总体任务如您所愿。

以及有问题的 行结束问题, 也暗示在评论中 ,你需要考虑到这样一个事实,当你 运行 WMIC 命令,您这样做时包含了字符串 winlog。这意味着 wmic.exe 进程 CommandLine 也将匹配字符串 winlog,您需要对此进行过滤。它变得更加复杂,因为 For 的带括号的 WMIC 命令也在 cmd.exe 的单独实例中 运行 所以 cmd.exe 进程 CommandLine将包含 WMIC 命令,因此也包含字符串 winlog。因此,您还需要在 WMIC 命令中对此进行额外过滤。

总而言之,在您在问题中显示的三个 ProcessID 输出中,8260115768596 一个用于 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 的另一个实例。如果这两种可能性中的任何一种都是可能的,那么您的整个方法都需要重新考虑。