逗号分隔WMIC命令
我做了这个脚本,使用WMIC从远程计算机逗号分隔WMIC命令
set /p "user=write UserName="
set /p "password=write Password="
for /f "tokens=*" %%a in (ip.txt) do (
wmic /node:%%a /user:%user% /password:%password% computersystem get Name /format:table
wmic /node:%%a /user:%user% /password:%password% computersystem get Model /format:table
wmic /node:%%a /user:%user% /password:%password% computersystem get totalphysicalmemory /format:table
wmic /node:%%a /user:%user% /password:%password% cpu get Name /format:table
wmic /node:%%a /user:%user% /password:%password% path Win32_VideoController get Name /format:table
wmic /node:%%a /user:%user% /password:%password% os get Caption /format:table
wmic /node:%%a /user:%user% /password:%password% csproduct get identifyingnumber /format:table
wmic /node:%%a /user:%user% /password:%password% desktopmonitor get screenheight /format:table
wmic /node:%%a /user:%user% /password:%password% desktopmonitor get screenwidth /format:table
)>>a.csv
获得信息,但输出是有点不可思议它的方式隔开“中输入”知道怎样使用逗号分隔?
你可以试试下面的代码片段:
@echo off
setlocal EnableDelayedExpansion
set /P "user=write UserName="
set /P "password=write Password="
> "a.csv" (
for /F "usebackq tokens=*" %%a in ("ip.txt") do (
set "lineString="
for /F "tokens=1,* delims==" %%A in ('wmic /node:%%a /user:%user% /password:%password% computersystem get Name /value') do for /F "delims=" %%Z in ("%%B") do set "lineString=!lineString!,%%Z"
for /F "tokens=1,* delims==" %%A in ('wmic /node:%%a /user:%user% /password:%password% computersystem get Model /value') do for /F "delims=" %%Z in ("%%B") do set "lineString=!lineString!,%%Z"
for /F "tokens=1,* delims==" %%A in ('wmic /node:%%a /user:%user% /password:%password% computersystem get totalphysicalmemory /value') do for /F "delims=" %%Z in ("%%B") do set "lineString=!lineString!,%%Z"
for /F "tokens=1,* delims==" %%A in ('wmic /node:%%a /user:%user% /password:%password% cpu get Name /value') do for /F "delims=" %%Z in ("%%B") do set "lineString=!lineString!,%%Z"
for /F "tokens=1,* delims==" %%A in ('wmic /node:%%a /user:%user% /password:%password% path Win32_VideoController get Name /value') do for /F "delims=" %%Z in ("%%B") do set "lineString=!lineString!,%%Z"
for /F "tokens=1,* delims==" %%A in ('wmic /node:%%a /user:%user% /password:%password% os get Caption /value') do for /F "delims=" %%Z in ("%%B") do set "lineString=!lineString!,%%Z"
for /F "tokens=1,* delims==" %%A in ('wmic /node:%%a /user:%user% /password:%password% csproduct get identifyingnumber /value') do for /F "delims=" %%Z in ("%%B") do set "lineString=!lineString!,%%Z"
for /F "tokens=1,* delims==" %%A in ('wmic /node:%%a /user:%user% /password:%password% desktopmonitor get screenheight /value') do for /F "delims=" %%Z in ("%%B") do set "lineString=!lineString!,%%Z"
for /F "tokens=1,* delims==" %%A in ('wmic /node:%%a /user:%user% /password:%password% desktopmonitor get screenwidth /value') do for /F "delims=" %%Z in ("%%B") do set "lineString=!lineString!,%%Z"
if defined lineString echo(!lineString:~1!
)
)
endlocal
exit /B
的wmic
输出存储到,
- 分隔字符串中的变量lineString
。为了捕获命令的输出,for /F
循环是完美的。但是,wmic
命令会生成Unicode输出,因此需要两个嵌套的for /F
循环才能进行适当的Unicode/ANSI转换;单个循环会在字符串中留下孤立的尾随回车符。
的wmic
输出格式已从/format:table
改变为/value
得到这样的输出:Caption=Microsoft Windows 7 Enterprise
,所以for /F
环可以采取=
作为分隔符,并得到所需的值。
除了这一切,我也改变了以下内容:
在代码中,你分别重定向每一个循环迭代的输出。为避免这种情况,()
已放在(最外面的)for /F
循环中,因此整个数据被重定向到a.csv
。因此,重定向操作符已从追加类型>>
更改为(over)写入类型>
。
Delayed expansion已启用哪些修改和()
之间读取内for
回路或代码块的变量(lineString
)时是必需的。
我刚刚发现我错过了'for/F'循环的'demils ='选项中的'=';并且我插入了'@echo off'在开始时避免将任何命令回声输出到文件'a.txt';参见我的[编辑](http://stackoverflow.com/revisions/34909662/2)... – aschipfl
惊人的,谢谢!,我想我明白了,但是为什么'/ format:table'变成'/ value'? – TmCookieMonster
假设我们有'wmic OS获得Caption/format:table',输出将是一行'Caption',通过'Microsoft Windows 7 Enterprise',所以g等价值,周围的for/F循环需要迭代两次,或者我需要硬编码一个特定的行(数)被采取; '/ value'只有一行;只有在“wmic”请求单个值的情况下,所有这一切才是真实的。然而,如果你喜欢使用'/ format:table',你可以这样做,只要你相应地调整'for/F'选项:''skip = 1 delims =“'而不是''tokens = 1,* delims ==“' – aschipfl
对于同一个类,您可以获得多个值,如:'wmic/node:%% a/user:%user%/ password:%password%computersystem get Name,Model/format:table'按字母顺序排列) – aschipfl
是的,但是当我把它放在一个csv文件中时我需要它以逗号分隔,所以我可以将它导入另一个程序来组织 – TmCookieMonster
在纯批处理脚本中,这不是微不足道的,因为'wmic'产生Unicode输出,有些麻烦;然而,你可以在for/F循环中执行_every_'wmic'命令行,以便循环解析输出:'for/F“tokens = 1,* delims ==”%% A('wmic OS GET Caption/VALUE')do for/F“delims =”%% Z in(“%% B”)do echo(%% Z'(有两个循环:外部分离感兴趣的值,内部分离消除潜在的在Unicode/ANSI转换过程中由外部字符留下的孤立尾部回车字符) – aschipfl