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



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

@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

代码的问题在于 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命令中的引号

最新更新