Batch file 批处理文件-在For循环中获取卷标

Batch file 批处理文件-在For循环中获取卷标,batch-file,for-loop,Batch File,For Loop,我正在尝试设置一个批处理文件,该文件将遍历PC上的本地驱动器,并将每个驱动器的卷名放入一个环境变量中,然后用于进一步处理 这是我到目前为止得到的结果,但是它没有将正确的卷标值返回到for循环内的VLABEL1变量中 @echo off setlocal EnableExtensions EnableDelayedExpansion for /f "tokens=2 delims==" %%D in ('wmic logicaldisk where "drivetype=3" get name

我正在尝试设置一个批处理文件,该文件将遍历PC上的本地驱动器,并将每个驱动器的卷名放入一个环境变量中,然后用于进一步处理

这是我到目前为止得到的结果,但是它没有将正确的卷标值返回到for循环内的VLABEL1变量中

@echo off
setlocal EnableExtensions EnableDelayedExpansion

for /f "tokens=2 delims==" %%D in ('wmic logicaldisk where "drivetype=3" get name /format:value') do (
    echo Processing Drive %%D
    call :GetLabel %%D VLABEL1
    echo The Label of Volume %%D is !VLABEL1!
    echo.
)
endlocal 
goto :EOF

:GetLabel
setlocal
for /f "tokens=5*" %%A in ('vol "%~1"^|find "Volume in drive "') do (
    set VOLLABEL=%%B
)
set %2=%VOLLABEL%
endlocal
goto :EOF

我想说的是,我尝试过各种组合和排列,但没有成功,因此我非常感谢任何建议。

尝试从命令行运行此命令,您将看到原因

for /f "tokens=2 delims==" %a in ('wmic logicaldisk where "drivetype=3" get name /format:value') do echo .[%a].
在每一行的末尾都有一个传统的回车

因此,有必要在调用子例程之前消除它

for /f "tokens=2 delims==" %%A in (
    'wmic logicaldisk where "drivetype=3" get name /format:value'
) do for %%D in (%%A) do (
    ....
)
...
传统的
for
循环会删除CR,因此现在变量中有了正确的值来调用子程序

现在,在你的子程序中

set %2=%VOLLABEL%
endlocal
endlocal
取消上行的赋值。它的任务是取消自上次setlocal以来在环境中所做的更改。因此,有必要同时更改变量和取消非必需的更改。要做到这一点,可以使用解析器在行上工作的事实。所以代码应该写成

endlocal & set "%2=%VOLLABEL%"

读取整行,在解析时,所有读取的值都替换为值,然后执行该行。因此,当执行行中的第二个命令(set)时,无法访问
%VOLLABEL%
变量。在执行
endlocal
之前,此读数已替换为变量的值。

TVM提供了非常有用的解释,很抱歉,我花了这么长时间才确认您的答复。