使用 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
循环获取所需的值,而无需额外的字符和/或换行符。