我想为 wmic 输出中的每个条目创建单独的文本文件。
到目前为止
WMIC.exe /Node:localhost /Namespace:\\\root\SecurityCenter2 Path AntiVirusProduct Get displayName /Format:csv>AVlist.txt
WMIC.exe /Node:localhost /Namespace:\\\root\SecurityCenter2 Path AntiSpywareProduct Get displayName /Format:csv>>AVlist.txt
给我一份包含以下内容的列表
Node,displayName
MAINCOMPUTER,Number1 Antivirus
MAINCOMPUTER,Number2 Antivirus
Node,displayName
MAINCOMPUTER,Number2 Antivirus
MAINCOMPUTER,Number1 Antispyware
我想要做的是创建一系列标记为
Number1 Antivirus.txt
Number2 Antivirus.txt
Number1 Antispyware.txt
没有任何重复,不会覆盖任何现有文件,也不会保存每次运行 wmic 时创建的“Node,displayName”标头......
现在我已经为此苦苦挣扎了几天,并想出了一个巨大的混乱文件,它严重依赖于创建临时文件并在之后删除它们......不优雅,过于复杂,我就是讨厌它。所以,我想知道这里是否有任何巫师会有一个更简单的解决方案?
这是我目前造成的混乱。不要太仔细地查看这些粗制滥造的代码。
WMIC.exe /Node:localhost /Namespace:\\\root\SecurityCenter2 Path AntiVirusProduct Get displayName /Format:csv>AVlist.txt
WMIC.EXE /Node:localhost /Namespace:\\\root\SecurityCenter2 Path AntiSpywareProduct Get displayName /Format:csv>>AVlist.txt
:: remove white spaces
for /f "skip=1 delims=" %%a in (AVlist.txt) do (
set str=%%a
set str=%str:'=%
set str=%str:,=%
echo %str% >>%temp%\filetmp.txt
)
xcopy %temp%\filetmp.txt %~dp0\AVlist.txt /y
del %temp%\filetmp.txt /f /q
:: remove duplicate lines
setlocal enabledelayedexpansion
set inputfile=AVlist.txt
set outputfile=AVlist2.txt
echo File to be processed
echo.
type %inputfile%
echo.
if exist sorted.txt del sorted.txt
sort %inputfile% /O %temp%\sorted.txt
if exist %outputfile% del %outputfile%
set lastline=
for /f "delims==" %%L in (sorted.txt) do (
set thisline=%%L
if not "!thisline!"=="!lastline!" echo !thisline!>>%outputfile%
set lastline=%%L
)
del sorted.txt
echo Duplicates removed:
echo.
setlocal disabledelayedexpansion
:: remove header
ren AVlist2.txt AVlist2.txt.old
findstr /v /b /c:"Node,displayName" AVlist2.txt.old > AVlist2.txt
type avlist2.txt
pause
哎呀!
答案1
如果我理解正确你想要完成的任务,这批任务将会完成:
@Echo off
For /f "skip=1 tokens=1,2 delims=," %%A in (
'WMIC.exe /Namespace:\\root\SecurityCenter2 Path AntiVirusProduct Get displayName /Format:csv^|find "," '
) Do For /f "delims=" %%C in ("%%B") Do Find /I "%%A,%%C" "%%C.txt" >NUL 2>&1 ||(>> "%%C.txt" Echo:%%A,%%C)
For /f "skip=1 tokens=1,2 delims=," %%A in (
'WMIC.exe /Namespace:\\root\SecurityCenter2 Path AntiSpywareProduct Get displayName /Format:csv^|find ","'
) Do For /f "delims=" %%C in ("%%B") Do Find /I "%%A,%%C" "%%C.txt" >NUL 2>&1 ||(>> "%%C.txt" Echo:%%A,%%C)
- 无需临时文件和排序,
for /f
直接使用和解析 wmic 输出skip=1
去掉标题,tokens=1,2 delims=,"
分割线并存储node
到%%A
和displayname
到%%B
find
检查该条目是否已经存在于目标文件中。
编辑3已修复批次,现在应该可以工作了。
答案2
这是我最终做出的
不如上面的答案那么好,但仍然有效。
For /f "skip=2 tokens=1,2 delims=," %%A in (
'WMIC.exe /Node:localhost /Namespace:\\\root\SecurityCenter2 Path AntiVirusProduct Get displayName /Format:csv '
) Do (
set str=%%a
set str=%str:'=%
set str=%str:,=%
)|Find /i "%%A,%%B" "%%B.txt" >NUL 2>&1|(echo.>>"%%B.txt")
但由于我喜欢单行脚本,我将放弃此解决方案,选择最干净的解决方案