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

时间:2014-05-25 13:07:58

标签: 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 /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

有人说我尝试了各种组合&排列,但没有成功,所以我很感激任何建议。

1 个答案:

答案 0 :(得分:1)

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

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 (
    ....
)
...

aditional for循环删除CR,所以现在变量中有正确的值来调用子例程。

现在,在您的子程序中,

set %2=%VOLLABEL%
endlocal

endlocal取消上线的分配。这是它的使命,取消了自上一次setlocal以来在环境中所做的改变。因此,有必要同时更改变量并取消不需要的更改。为此,可以使用解析器在线上工作的事实。所以代码应该写成

endlocal & set "%2=%VOLLABEL%"

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