标题: [其他] [讨论]批处理for语句配合Wmic 使用中的一些问题 [打印本页]
作者: fastslz 时间: 2008-12-21 14:10 标题: [讨论]批处理for语句配合Wmic 使用中的一些问题
http://bbs.bathome.net/viewthread.php?tid=597
在上面的连接上发现wmic和set/p语法上的一个冲突-
- @echo off
- set /p=生成一个不带换行符的文本<nul>name.txt
- Wmic Process Get Name
- :此演示因为set/p语法导致Wmic命令无法运行
- pause
复制代码
-
- @echo off
- >name.txt set /p=生成一个不带换行符的文本<nul
- Wmic Process Get Name
- :虽然就语法上看没太大区别,而此时Wmic命令能正常运行
- pause
复制代码
现在的问题是- @echo off
- for /f "skip=3 delims=" %%a in ('Wmic Process Get Name 2^>nul') do echo 前面%%a后面
- pause
复制代码
运行结果前面字符无法显示,而后面的却跑到前面去了。包括/format:csv和/Value同样结果,这个问题一直困扰着我,曾花大量时间测试和在google寻找解答始终一无所获,希望大家一起探讨和解答
作者: namejm 时间: 2008-12-21 14:45
先单独对%%a赋值,然后引用新变量,在新变量值的前后添加字符串:- @echo off
- for /f "skip=3 delims=" %%a in ('Wmic Process Get Name 2^>nul') do (
- set "str=%%a"
- call echo 前面%%str%%后面
- )
- pause
复制代码
通过运行结果的观察发现,“后面”这个字符串是对齐显示的,由此推测wmic的执行结果中带了不可见的控制字符,类似使用Tab键的排版,但是又具有退格字符键的一些性质。本人功力不深,分析只能停留在表面上,留待后来的人继续分析。
作者: wxcute 时间: 2008-12-21 15:43
最简单的方法,还自动对齐- @echo off
- for /f "skip=3 delims=" %%a in ('"Wmic Process Get Name"') do (
- call echo 前面%%a后面
- )
- pause
复制代码
外部标签,不自动对齐- @echo off
- for /f "skip=3 delims=" %%a in ('"Wmic Process Get Name"') do (
- call :show %%a
- )
- pause
- goto :eof
- :show
- echo 前面%1后面
复制代码
自己加扩展名,不适用于非.EXE格式进程- @echo off
- for /f "skip=3 delims=" %%a in ('"Wmic Process Get Name"') do (
- echo 前面%%~na.exe后面
- )
- pause
复制代码
[ 本帖最后由 wxcute 于 2008-12-21 15:44 编辑 ]
作者: fastslz 时间: 2008-12-21 17:34
原来是call忽略掉不可见的控制字符
目前结论for + wmic + call
作者: 随风 时间: 2008-12-21 17:38
一直对wmic不感冒的原因之一也在此(当然最大的原因还是不懂英文^_^)
很多时候直接显示就可以,但在前后加内容显示就出错,应该还是不可见字符在作怪。。
甚至有时先设为变量都不行。。具体案例不记得了。。。
作者: fastslz 时间: 2008-12-21 17:46
哎、发觉自己真的很笨,之前用过N次for + wmic + call语法,今天因jm指点才破疑,以前是需要用到call才用,而现在是必须要用call
除了这个方法大家看看还有其它办法吗?
[ 本帖最后由 fastslz 于 2008-12-21 18:10 编辑 ]
作者: everest79 时间: 2008-12-22 08:22
回车符呀,不用工具很难清除的
作者: cc5511 时间: 2020-8-27 10:38
本帖最后由 cc5511 于 2020-8-27 10:39 编辑
回复 3# wxcute
谢谢你的解疑!我遇到的问题也解决了,echo前面加call就行了。- @echo off
- setlocal enabledelayedexpansion
-
- for /f "tokens=2 delims==" %%a in ('wmic memphysical get MemoryDevices /value') do set nctsl=%%a
- call echo 内存条数量为:!nctsl!根
-
- set sz=0
- for /f "tokens=2 delims==" %%a in (
- 'wmic memorychip get Capacity^,ConfiguredClockSpeed^,DeviceLocator^,Manufacturer^,PartNumber /value ^| find /i "Capacity"'
- ) do (
-
- set /a sz=!sz!+1
- if !sz! equ 1 set nc!sz!=%%a
- if !sz! equ 2 set nc!sz!=%%a
- if !sz! equ 3 set nc!sz!=%%a
- if !sz! equ 4 set nc!sz!=%%a
- )
-
- for /l %%a in (1,1,!nctsl!) do call echo 第%%a根内存条容量:!nc%%a!字节
-
-
- pause
复制代码
作者: cc5511 时间: 2020-8-27 15:21
谢谢3楼的解疑!经过学习,改造了下,可以通过for+call echo过滤一次,就能正常赋值到变量上了。
主要是这句:for /f "delims=" %%b in ('call echo !cpuxh!') do set cpuxh=%%b- @echo off
- setlocal enabledelayedexpansion
- for /f "tokens=2 delims==" %%a in ('wmic cpu get Name /value') do set cpuxh=%%a
- for /f "delims=" %%b in ('call echo !cpuxh!') do set cpuxh=%%b
- echo CPU型号为:变量前面!cpuxh!变量后面
- pause
复制代码
作者: cc5511 时间: 2020-8-27 15:27
回复 7# everest79
这样过滤一下就好了:- for /f "delims=" %%b in ('call echo !变量!') do set 变量=%%b
复制代码
欢迎光临 批处理之家 (http://bbs.bathome.net/) |
Powered by Discuz! 7.2 |