如何获取当前控制台提示符的volumelabel

时间:2013-12-22 14:40:17

标签: windows batch-processing drive

例如我的drivelabel for driveletter e volume-abc

所以例如im在shell中:

e:\directory-a\bc\>

现在我需要driveletter e:的volumelabel,声明如下:

vol %CD:~0,1%:

我将获得当前的卷标,但有一堆(抱歉,只有德语):

Datenträger in Laufwerk E: ist volume-abc
Volumeseriennummer: 4A69-FD21

所以也许可以从这个输出中解析/提取字符串volume-abc,但对我来说这似乎是一种糟糕的方式,因为输出可能与windows-和language-version不同。所以我不知道如何以健壮的方式进行字符串操作。

1 个答案:

答案 0 :(得分:1)

@ECHO OFF
SETLOCAL
SET volume=%1
IF NOT DEFINED volume SET volume=%CD%
SET "volume=%volume:~0,1%:"
SET "vlabel="
SET "vserial="
FOR /f "delims=" %%a IN ('vol %volume%') DO (
 CALL :lastparm %%a
)    
ECHO LABEL is %vlabel%
ECHO Serial is %vserial%
endlocal&set vlabel=%vlabel%&set vserial=%vserial%
GOTO :EOF

:lastparm
SET $1=%2
IF DEFINED $1 shift& GOTO lastparm
IF DEFINED vlabel (SET vserial=%1) ELSE (SET vlabel=%1)
GOTO :eof

这应该按照您的要求 - 在限制范围内。运行批处理,将drivename作为第一个参数。如果未提供参数,则将选择当前驱动器。

在英语中,VOL的回复可能是

 Volume in drive C has no label.
 Volume Serial Number is 830B-46FA

 Volume in drive M is XPC
 Volume Serial Number is 62FF-EBB1

因此,与语言无关的版本似乎有点困难。上面的代码会为label.提供C:,而不是no label.任何其他语言都会生成,我不知道。

然而,可能是响应是小写的事实可能是定义“未标记”的一种方式 - 我相信真正的标签必须是大写的。

现在看来卷标可能最多为32个字符,我不知道现在是否允许空格......

编辑:添加ENDLOCAL行以设置在调用者环境中找到的值。该方法乍一看似乎不合逻辑,但利用了cmd使用的解析过程。整个endlocal行被解析,%var%被其内容替换。然后执行该行,首先处理自setlocal以来所做的所有环境更新,然后将感兴趣的值分配回变量。