变量作用域 - 访问循环外的变量 - Windows 批处理
Variable Scope - access variable outside for-loop - Windows Batch
如何访问变量 !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
您的代码存在的问题是 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
命令中的引号
如何访问变量 !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
您的代码存在的问题是 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
命令中的引号