Board logo

标题: [特效代码] [已解决]wmic命令在批处理for中为何出错? [打印本页]

作者: Hello123World    时间: 2011-5-18 17:40     标题: [已解决]wmic命令在批处理for中为何出错?

  1. wmic logicaldisk where drivetype=2 get deviceid,size
复制代码
查询本机的移动硬盘,这个是没问题的。
  1. @echo off
  2. for /f "delims=" %%i in ('wmic logicaldisk where drivetype=2 get deviceid,size') do echo %%i
  3. pause>nul
复制代码
放在for中就会出错——2 - Invalid alias verb(无效的别名动词).
  1. @echo off
  2. for /f "delims=" %%i in ('wmic logicaldisk where drivetype="2" get deviceid,size') do echo %%i
  3. pause>nul
复制代码
为2打上引号,还是出错——2 - Invalid alias verb.

这种问题我以前遇到过,当时乱打了一次引号把什么类容引起来就解决了。

1.这问题怎么解决?
2.为什么会产生这种问题?(产生这种问题的原理是什么?)
作者: CrLf    时间: 2011-5-18 18:21

因为=和,都是参数的分隔符,而for输入的实质是把其中的内容当作参数传递给cmd,所以cmd会先按照参数的划分方式来进行划分
解决方案一:
  1. @echo off
  2. for /f "delims=" %%i in ('wmic logicaldisk where drivetype^=2 get deviceid^,size') do echo %%i
  3. pause>nul
复制代码
解决方案二:
  1. @echo off
  2. for /f "delims=" %%i in ('"wmic logicaldisk where drivetype=2 get deviceid,size"') do echo %%i
  3. pause>nul
复制代码

作者: CrLf    时间: 2011-5-18 18:26

本帖最后由 zm900612 于 2011-5-18 18:48 编辑

刚才考虑了一下,2楼说法欠妥,出错不是出在被cmd划分参数的时候,而是出现在for的预处理时:
  1. for /f "delims=" %%a in ('echo 123,234=345') do echo %%a
  2. pause
复制代码
运行一下就明白了,for预处理时,把即没有被转义又没有被""包起来的分割符转换为空格,然后再传递给cmd,cmd再以%*的方式获取参数,以前没想这么深。
作者: Hello123World    时间: 2011-5-18 18:26

悲剧,我知道我为什么这次打对了引号却没有正确显示的原因了——我把u盘拔了……

不过这次更加深了对= , 作为分隔符的印象。
多谢zm900612
作者: yrj2929    时间: 2023-9-22 11:11

https://www.it1352.com/1966062.html
对于带Wmic的/F有害输出
文中有原因分析和通用的解决方案。




欢迎光临 批处理之家 (http://bbs.bathome.net/) Powered by Discuz! 7.2