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

时间:2019-05-17 16:09:39

标签: batch-file wmic

我在一个批处理文件中收到一个奇怪的行为调用wmic,我试图获取进程的ID,但是当我在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进程的ID,如果我使用开始%%会发生这种情况,则实际输出是随机的,至少我认为是随机的;例如:8260,11576,8596,这与搜索的值无关

1 个答案:

答案 0 :(得分:0)

这是对您的特定问题的解答,它不会处理您的代码中的其他问题,请参阅我的评论,或考虑到一旦解决,总体任务是否会像您一样打算这样做。

除了有问题的行结尾问题,还暗示在注释中,您还需要考虑以下事实:在运行WMIC命令时,您可以使用包含的字符串winlog来实现。这意味着wmic.exe进程CommandLine也将与字符串winlog匹配,因此您需要对此进行过滤。但是,由于WMIC中带括号的For命令也在单独的cmd.exe实例中运行,因此cmd.exe进程CommandLine将包含{ {1}}命令,因此也使用字符串WMIC。因此,您还需要在winlog命令中对此进行过滤。

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