我正在尝试设置一个批处理文件,该文件将遍历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
有人说我尝试了各种组合&排列,但没有成功,所以我很感激任何建议。
答案 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
执行之前,此读取已替换为变量的值。