找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 35257|回复: 9

[其他] [讨论]批处理for语句配合Wmic 使用中的一些问题

[复制链接]
发表于 2008-12-21 14:10:45 | 显示全部楼层 |阅读模式
http://bbs.bathome.net/viewthread.php?tid=597
在上面的连接上发现wmic和set/p语法上的一个冲突

  1. @echo off
  2. set /p=生成一个不带换行符的文本<nul>name.txt
  3. Wmic Process Get Name
  4. :此演示因为set/p语法导致Wmic命令无法运行
  5. pause
复制代码

  1. @echo off
  2. >name.txt set /p=生成一个不带换行符的文本<nul
  3. Wmic Process Get Name
  4. :虽然就语法上看没太大区别,而此时Wmic命令能正常运行
  5. pause
复制代码
现在的问题是
  1. @echo off
  2. for /f "skip=3 delims=" %%a in ('Wmic Process Get Name 2^>nul') do echo 前面%%a后面
  3. pause
复制代码
运行结果前面字符无法显示,而后面的却跑到前面去了。包括/format:csv和/Value同样结果,这个问题一直困扰着我,曾花大量时间测试和在google寻找解答始终一无所获,希望大家一起探讨和解答
发表于 2008-12-21 14:45:23 | 显示全部楼层
  先单独对%%a赋值,然后引用新变量,在新变量值的前后添加字符串:
  1. @echo off
  2. for /f "skip=3 delims=" %%a in ('Wmic Process Get Name 2^>nul') do (
  3.     set "str=%%a"
  4.     call echo 前面%%str%%后面
  5. )
  6. pause
复制代码
  通过运行结果的观察发现,“后面”这个字符串是对齐显示的,由此推测wmic的执行结果中带了不可见的控制字符,类似使用Tab键的排版,但是又具有退格字符键的一些性质。本人功力不深,分析只能停留在表面上,留待后来的人继续分析。

评分

参与人数 1PB +5 收起 理由
wxcute + 5 够深入

查看全部评分

发表于 2008-12-21 15:43:30 | 显示全部楼层
最简单的方法,还自动对齐
  1. @echo off
  2. for /f "skip=3 delims=" %%a in ('"Wmic Process Get Name"') do (
  3.  call echo 前面%%a后面
  4. )
  5. pause
复制代码
外部标签,不自动对齐
  1. @echo off
  2. for /f "skip=3 delims=" %%a in ('"Wmic Process Get Name"') do (
  3.  call :show %%a
  4. )
  5. pause
  6. goto :eof
  7. :show
  8. echo 前面%1后面
复制代码
自己加扩展名,不适用于非.EXE格式进程
  1. @echo off
  2. for /f "skip=3 delims=" %%a in ('"Wmic Process Get Name"') do (
  3.  echo 前面%%~na.exe后面
  4. )
  5. pause
复制代码

[ 本帖最后由 wxcute 于 2008-12-21 15:44 编辑 ]
 楼主| 发表于 2008-12-21 17:34:49 | 显示全部楼层
原来是call忽略掉不可见的控制字符
目前结论for + wmic + call
发表于 2008-12-21 17:38:14 | 显示全部楼层
一直对wmic不感冒的原因之一也在此(当然最大的原因还是不懂英文^_^)
很多时候直接显示就可以,但在前后加内容显示就出错,应该还是不可见字符在作怪。。
甚至有时先设为变量都不行。。具体案例不记得了。。。
 楼主| 发表于 2008-12-21 17:46:47 | 显示全部楼层
哎、发觉自己真的很笨,之前用过N次for + wmic + call语法,今天因jm指点才破疑,以前是需要用到call才用,而现在是必须要用call
除了这个方法大家看看还有其它办法吗?

[ 本帖最后由 fastslz 于 2008-12-21 18:10 编辑 ]
发表于 2008-12-22 08:22:59 | 显示全部楼层
回车符呀,不用工具很难清除的
发表于 2020-8-27 10:38:44 | 显示全部楼层
本帖最后由 cc5511 于 2020-8-27 10:39 编辑

回复 3# wxcute


    谢谢你的解疑!我遇到的问题也解决了,echo前面加call就行了。

  1. @echo off
  2. setlocal enabledelayedexpansion

  3. for /f "tokens=2 delims==" %%a in ('wmic memphysical get MemoryDevices /value') do set nctsl=%%a
  4. call echo         内存条数量为:!nctsl!根

  5. set sz=0
  6. for /f "tokens=2 delims==" %%a in (
  7.         'wmic memorychip get Capacity^,ConfiguredClockSpeed^,DeviceLocator^,Manufacturer^,PartNumber /value ^| find /i "Capacity"'
  8. ) do (

  9. set /a sz=!sz!+1
  10. if !sz! equ 1 set nc!sz!=%%a
  11. if !sz! equ 2 set nc!sz!=%%a
  12. if !sz! equ 3 set nc!sz!=%%a
  13. if !sz! equ 4 set nc!sz!=%%a
  14. )

  15. for /l %%a in (1,1,!nctsl!) do call echo         第%%a根内存条容量:!nc%%a!字节


  16. pause
复制代码
发表于 2020-8-27 15:21:49 | 显示全部楼层
谢谢3楼的解疑!经过学习,改造了下,可以通过for+call echo过滤一次,就能正常赋值到变量上了。
主要是这句:for /f "delims=" %%b in ('call echo !cpuxh!') do set cpuxh=%%b

  1. @echo off
  2. setlocal enabledelayedexpansion
  3. for /f "tokens=2 delims==" %%a in ('wmic cpu get Name /value') do set cpuxh=%%a
  4. for /f "delims=" %%b in ('call echo !cpuxh!') do set cpuxh=%%b
  5. echo                               CPU型号为:变量前面!cpuxh!变量后面
  6. pause
复制代码
发表于 2020-8-27 15:27:37 | 显示全部楼层
回复 7# everest79

这样过滤一下就好了:

  1. for /f "delims=" %%b in ('call echo !变量!') do set 变量=%%b
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-17 09:48 , Processed in 0.016911 second(s), 9 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表