是否可以使用 WMIC 仅获取驱动器标签?

是否可以使用 WMIC 仅获取驱动器标签?

使用 WMIC,我想要仅有的根据驱动器号确定驱动器标签:

for /f "skip=1" %a in ('wmic volume where "Driveletter like '%C%'" get label') do echo %a

现在,那些了解 Windows 命令行的人会明白为什么这不能按预期工作,因为我正在“执行”回显。因此,使用上面的命令,输出如下所示(这不是我希望的):

C:\>for /f "skip=1" %a in ('wmic volume where "Driveletter like '%C%'" get label') do echo %a

C:\>echo System
System

C:\>echo
ECHO is on.

WMIC 命令的原始输出如下所示:

Label
System

目标是仅跳过第一行(我尝试使用的原因for /f "skip=1"...)并仅获取第二行。但是,我不确定如何仅显示它而不回显它。

答案1

您有两个问题。Techie007 发现了第一个问题 -@如果您想防止命令回显到屏幕上,则必须在 DO 命令前加上前缀。如果 ECHO 为 OFF,则无需这样做。

另一个问题是 FOR /F 与 WMIC 的 unicode 输出交互时出现的一个非常烦人的现象。unicode 不知何故被错误地转换为 ANSI,导致每行都以 \r\r\n 结尾。FOR /F 在每个 \n 处中断,并且只删除单个终端 \r,留下一个多余的不需要的 \r。(请注意 \r 代表回车符,\n 代表换行符)

WMIC 输出在末尾包含一个额外的空行。额外的不需要的 \r 阻止 FOR /F 忽略该行(它不被视为空行)。当您 ECHO 得到该值时ECHO is on.

有多种方法可以解决这个问题,但我最喜欢的是将输出通过额外的 FOR /F 来删除不需要的 \r。

for /f "skip=1 delims=" %a in ('wmic volume where "Driveletter like '%C%'" get label') do @for /f "delims=" %b in ("%a") do @echo %b

答案2

Echo加上符号前缀@以防止显示命令。

即(为简洁起见,已剪辑):

for ... do @echo %a

答案3

正如楼主所说@dbenham 有多种方法可以解决这个问题

  • 在命令行中:
for /f usebackq^tokens^=4delims^=^<^> %G in (`wmic volume where "Driveletter like '%C%'" get label /format:xml ^| find "VALUE"`)do @echo/%G
  • 在 bat/cmd 文件中:
@echo off

for /f usebackq^tokens^=4delims^=^<^> %%G in (`wmic volume where "Driveletter like '%%C%%'" get label /format:xml ^| find "VALUE"`)do echo/%%G

将格式更改为 xml 并且输出将更改编码,之后过滤以在一行中for循环获取所需的值,而无需额外的字符和/或换行符。

相关内容