如何从 wmic 输出创建单独的文本文件

如何从 wmic 输出创建单独的文本文件

我想为 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%%Adisplayname%%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")    

但由于我喜欢单行脚本,我将放弃此解决方案,选择最干净的解决方案

相关内容