变量范围 - 在for循环外访问变量 - Windows批处理

时间:2015-04-30 11:24:26

标签: windows shell loops batch-file command-line

如何访问变量!processid!在for循环之外? 我无法让它工作

@ECHO OFF
SETLOCAL ENABLEDELAYEDEXPANSION
SETLOCAL 

FOR /F "tokens=* skip=1 delims=" %%a in ('"wmic PROCESS WHERE "CommandLine LIKE '%%scanforstring%%' AND NOT CommandLine LIKE '%%WMIC%%'" get processid"') do (    
set prozessid=%%a
echo !prozessid!
)

echo !prozessid!

PAUSE
endlocal

1 个答案:

答案 0 :(得分:1)

代码的问题在于wmic命令的输出包括将覆盖检索到的进程ID的结束行。只有在没有值的情况下才能分配变量

set "prozessid="
for /f ...... do (
    if not defined prozessid (
        set "prozessid=%%a"
        echo !prozessid!
    )
)

或者您可以过滤wmic命令的输出以仅处理正确的行

@ECHO OFF
SETLOCAL ENABLEDELAYEDEXPANSION

FOR /F "usebackq tokens=2 delims==" %%a in (`
    wmic PROCESS WHERE " 
        CommandLine LIKE '%%scanforstring%%' 
        AND NOT CommandLine LIKE '%%WMIC%%'
    " get processid /value
`) do (    
    set prozessid=%%a
    echo 1 - !prozessid!
)

echo 2 - !prozessid!

PAUSE
endlocal

所做的更改:

1 - 更改了wmic查询以使用/value,因此我们获得格式key=value

的输出

2 - 更改for /f选项以使用等号作为分隔符并仅检索行中的第二个标记,因此只处理具有值的行并且%%a将保留pid

3 - 只是整容,更改了for /f以使用usebackq并更改了wmic命令中的引用