Board logo

标题: [其他] 【已解决】批处理中WMIC获取PDCOMP驱动名时这个%%a等于多少? [打印本页]

作者: lxzzr    时间: 2009-4-15 09:08     标题: 【已解决】批处理中WMIC获取PDCOMP驱动名时这个%%a等于多少?

  1. @echo off
  2. for /f "usebackq skip=1 delims=" %%a in (
  3. `"wmic sysdriver where name="PDCOMP" get pathname"`
  4. ) do (
  5. if "%%a" == "" (
  6. echo y
  7. ) else (
  8. echo n
  9. )
  10. )
  11. pause
复制代码
注:PDCOMP是本机的一个驱动名,但是没有文件路径
用上面的脚本,可以判断 %%a 不是为空,但是它究竟是多少呢??

[ 本帖最后由 lxzzr 于 2009-4-15 22:58 编辑 ]
作者: zqz0012005    时间: 2009-4-15 09:47

10个空格
作者: lxzzr    时间: 2009-4-15 10:33     标题: 回复 2楼 的帖子

不对哦!!呵呵
作者: zqz0012005    时间: 2009-4-15 16:03

与字符编码有关,CMD对编码的支持不是很好。
比如以前的reg命令“吃字符”问题,前不几还有一个帖子提到了“不可见字符”问题(一时没有找到)。
有些命令的输出是Unicode格式,会导致一些问题。
  1. @echo off
  2. for /f "usebackq skip=1 delims=" %%a in (
  3. `"wmic sysdriver where name="PDCOMP" get pathname"`
  4. ) do (
  5.     if "%%a" == "          " echo y
  6.     set var=%%a
  7. )
  8. if "%var%"=="          " echo y
  9. pause
复制代码
%%a的值可能包含不可见字符,而%var%的值是10个空格。
作者: everest79    时间: 2009-4-15 19:18

请参考get参数 /value
作者: zqz0012005    时间: 2009-4-15 20:50

即使加/value开关也一样,输出还是Unicode格式,仍然有编码问题。
而且加了/value开关结果竟然不同?

C:\>for /f "skip=1 delims=" %a in ('wmic datafile where "name='c:\\boot.ini'" get name') do @echo.%a
c:\boot.ini
C:\>for /f "skip=1 delims=" %a in ('wmic datafile where "name='c:\\boot.ini'" get name /value') do @echo.%a
(空行)
Name=c:\boot.ini
(空行)
(空行)
C:\>for /f "skip=1 tokens=2 delims==" %a in ('wmic datafile where "name='c:\\boot.ini'" get name /value') do @echo.%a
c:\boot.ini
C:\>rem 还有以前讨论过的不可见字符问题:
C:\>for /f "skip=1 delims=" %a in ('wmic datafile where "name='c:\\boot.ini'" get name') do @echo.%a-
-:\boot.ini
C:\>for /f "skip=1 delims=" %a in ('wmic datafile where "name='c:\\boot.ini'" get name') do @echo.%~dpa-
c:\-
C:\>for /f "skip=1 delims=" %a in ('wmic datafile where "name='c:\\boot.ini'" get name') do @echo.%~fa-
-:\boot.ini
C:\>for /f "skip=1 delims=" %a in ('wmic datafile where "name='c:\\boot.ini'" get name') do @echo.%a-|find /v ""
c:\boot.ini  -
C:\>for /f "tokens=2 delims==" %a in ('wmic datafile where "name='c:\\boot.ini'" get name /value^|find /i ":"') do @echo %a-|find /v ""
c:\boot.ini-
C:\>for /f "skip=1 delims=" %a in ('wmic datafile where "name='c:\\boot.ini'" get name') do @call echo.%a-
c:\boot.ini  -
C:\>for /f "tokens=2 delims==" %a in ('wmic datafile where "name='c:\\boot.ini'" get name /value^|find /i ":"') do @call echo %a-
c:\boot.ini-

作者: fastslz    时间: 2009-4-15 21:08

第1种方法
  1. @echo off
  2. for /f "usebackq skip=1 delims=" %%a in (
  3. `"wmic sysdriver where name="PDCOMP" get pathname"`
  4. ) do (
  5.     call :slz %%a
  6. )
  7. pause&exit
  8. :slz
  9. echo."%1"
复制代码

第2种方法
  1. @echo off
  2. for /f "usebackq skip=1 delims=" %%a in (
  3. `"wmic sysdriver where name="PDCOMP" get pathname/value"`
  4. ) do (
  5.     set %%a>nul
  6. )
  7. echo "%pathname%"
  8. pause
复制代码

作者: fastslz    时间: 2009-4-15 21:22

曾经有讨论过
以上2种方法都可行,但是输出内容包含特殊字符2种方法都不行。所以用wmic时有不可以见字符和特殊字符代码很难实现完美。我在写脚本备份&还原驱动时已经伤了很多脑细胞了,在http://bbs.bathome.net/viewthread.php?tid=743&page=1#pid3036 13楼中还使用了/format:csv参数,但这个参数在输出包含特殊字符“&”会变成“&”

[ 本帖最后由 fastslz 于 2009-4-15 21:36 编辑 ]
作者: lxzzr    时间: 2009-4-15 22:58

楼上的正解!!!!




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