我试图创建一个简单的脚本,从pclist.txt中使用计算机名称,获取序列号和型号,并导出到csv文件。我只是不明白为什么它不能在csv文件中打印序列号和型号。这是我的简单脚本。
@echo off
for /f %%i in (pclist.txt) do (
for /f "tokens=2 delims==" %%M in ('wmic /node:%%i csproduct get name /value') do set "Model=%%M"
for /f "tokens=2 delims==" %%I in ('wmic /node:%%i bios get serialnumber /value') do set "SN=%%I"
echo %%i, %SN%, %Model% >> list.csv
)
pause
我可能误解了你的意图,但我希望以下是实现你的预期任务的一般方法。
@%__AppDir__%wbem\WMIC.exe /Node:@pclist.txt /FailFast:1000 /Output:list.csv CSProduct Get Name /Format:CSV
@%__AppDir__%wbem\WMIC.exe /Node:@pclist.txt /FailFast:1000 /Append:list.csv BIOS Get SerialNumber /Format:CSV
@Pause
如果你想尝试只输出每个项目以及用逗号隔开的节点名称,那么也许这样就足够了。
@Echo Off
SetLocal EnableExtensions
(
For /F UseBackQDelims^=^ EOL^= %%G In (
"pclist.txt"
) Do (
For /F Tokens^=6Delims^=^" %%H In (
'%__AppDir__%wbem\WMIC.exe /Node:%%G /FailFast:1000 CSProduct Get Name /Format:MOF'
) Do (
For /F Tokens^=6Delims^=^" %%I In (
'%__AppDir__%wbem\WMIC.exe /Node:%%G /FailFast:1000 BIOS Get SerialNumber /Format:MOF'
) Do Echo %%G,%%H,%%I
)
)
)>"list.csv"
Pause
你的代码会运行得很好--当 wmic
也就不会有那句 "丑话说在前头 "的结尾。CRCRLF
. 第一个 CR
成为您的变量的一部分。CR
意思是 "将光标设置回行首",所以后面的所有回声(在同一行)都会覆盖之前的内容。
你可以用另一个 for
循环,将剩余的 CR
. 而且你不需要变量 SN
和 Model
;当你嵌套了 for
循环,你可以使用 for
变量直接代替。
@echo off
del list.csv 2>nul
for /f %%i in (pclist.txt) do (
for /f "tokens=2 delims==" %%M in ('wmic /node:"%%i" csproduct get name /value') do for %%m in (%%M) do (
for /f "tokens=2 delims==" %%S in ('wmic /node:"%%i" bios get serialnumber /value') do for %%s in (%%S) do (
>>list.csv echo %%i, %%s, %%m
)
)
)
type list.csv
pause
(Compo的代码是有效的, 因为所需的字符串是从行的中间切出来的, 所以行尾并不重要)