[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

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

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寻找解答始终一无所获,希望大家一起探讨和解答

  先单独对%%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键的排版,但是又具有退格字符键的一些性质。本人功力不深,分析只能停留在表面上,留待后来的人继续分析。
1

评分人数

尺有所短寸有所长,学好批处理没商量;
考虑问题复杂化,解决问题简洁化。

心在天山,身老沧州。

TOP

最简单的方法,还自动对齐
  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 编辑 ]

TOP

原来是call忽略掉不可见的控制字符
目前结论for + wmic + call

TOP

一直对wmic不感冒的原因之一也在此(当然最大的原因还是不懂英文^_^)
很多时候直接显示就可以,但在前后加内容显示就出错,应该还是不可见字符在作怪。。
甚至有时先设为变量都不行。。具体案例不记得了。。。
技术问题请到论坛发帖求助!

TOP

哎、发觉自己真的很笨,之前用过N次for + wmic + call语法,今天因jm指点才破疑,以前是需要用到call才用,而现在是必须要用call
除了这个方法大家看看还有其它办法吗?

[ 本帖最后由 fastslz 于 2008-12-21 18:10 编辑 ]

TOP

回车符呀,不用工具很难清除的

TOP

本帖最后由 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
复制代码

TOP

谢谢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
复制代码

TOP

回复 7# everest79

这样过滤一下就好了:
  1. for /f "delims=" %%b in ('call echo !变量!') do set 变量=%%b
复制代码

TOP

返回列表