【问题标题】:Using dual criteria with wmic and trying to create a batch file var对 wmic 使用双重标准并尝试创建批处理文件 var
【发布时间】:2017-03-23 07:31:23
【问题描述】:

所以我试图从批处理文件中的以下命令的输出创建一个变量。它在我获得进程 ID 1292 的命令提示符下工作正常:

C:\Documents and Settings\user>wmic process where (name="cmd.exe" and CommandLine like "%%%queue%%%") get ProcessID

哪个返回

ProcessId
1292

如果我这样做,如果只有一个实例正在运行,我会得到我需要的回报:

for /f "tokens=*" %%f in ('wmic process get processid /value ^| find "="') do set "%%f"
echo processid is %processid%

但是,我想使用多内容组合,因为如果我想获取多次运行的 exe 的 processID,至少我可以缩小范围。

任何建议将不胜感激。

【问题讨论】:

    标签: batch-file variables scripting pid wmic


    【解决方案1】:

    尝试类似的东西

    @echo off
        setlocal enableextensions disabledelayedexpansion
    
        set "queue=testing"
    
        for /f "tokens=2 delims==" %%a in ('
            wmic process 
            where "name='cmd.exe' And commandLine like '%%%queue%%%'" 
            get ProcessID /value
        ') do echo %%a
    

    @echo off
        setlocal enableextensions disabledelayedexpansion
    
        set "queue=testing"
    
        for /f "tokens=2 delims==" %%a in ('
            wmic process 
            where ^(
                name^="cmd.exe" 
                and commandLine like "%%%queue%%%" 
            ^)
            get ProcessID /value
        ') do echo %%a
    

    for /f 中转义wmic 命令的两个不同示例。

    • 在第一种情况下,where 条件用双引号括起来,值使用单引号。不需要转义字符,因为双引号会处理它,但所有条件必须在同一行。

    • 在第二种情况下,where 条件用括号括起来,值用双引号括起来。某些字符需要转义字符,但您有更多关于如何编写命令的选项。

    请注意,这些示例存在一个可能不会影响您的问题:两个示例都搜索cmd 实例,并且wmic 命令在单独的cmd 实例中启动(for /f 执行命令的方式) ,并且该实例也将匹配条件(它在自己的命令行中包含相同的子字符串)。

    编辑以适应 cmets

    @echo off
        setlocal enableextensions disabledelayedexpansion
    
        set "queue=testing"
    
        for /f "tokens=2 delims==" %%a in ('
            wmic process 
            where ^(
                name^="cmd.exe" 
                and commandLine like "%%%queue%%%" 
                and not commandLine like "%%[{%random%%random%%random%}]%%"
            ^)
            get ProcessID /value 2^>nul 
        ') do echo %%a
    

    为避免包含由包含wmic 命令的for /f 命令创建的cmd 实例,我们只需要包含一个附加条件来计算这个有问题的实例(该条件将在命令行中cmd 实例),但不能与我们要查找的实例匹配。

    【讨论】:

    • 您的代码运行良好。我有相同的但忘记了/值。有所作为。但是,您是正确的 wmic 命令启动了一个单独的 cmd 来清除。但在它清除之前,它会返回一个显示与我正在寻找的 PID 的 PID。无论如何要解决这个问题?我在想我可以写入文件并删除错误的 PID 并回显文件。
    • @DjeliStyles,答案已更新。看看这是否适合你
    • 那么随机值是三个不同的值 {%valueA%%valueB%%valueC%%} 还是相同的值三个?像 %dirPath%%dirPath%%dirPath%
    • @DjeliStyles,3 个随机值,但如果它们是相同值的 3 倍则相同。这只是一个例子,不是要求。要求是for /f 后台应用程序的命令行包含不会出现在任何有效/搜索到的cmd 实例中的东西(任何东西)。这样where 子句中的and not ... 将丢弃它。
    • 非常感谢!!奇迹般有效。我不得不问,这样做的目的是什么:设置“queue=testing”以及与此有什么关系:和命令行如“%%%queue%%%”
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-07-03
    • 2020-10-24
    • 1970-01-01
    • 1970-01-01
    • 2015-11-07
    • 2021-10-16
    • 1970-01-01
    相关资源
    最近更新 更多