Como criar arquivos de texto individuais de uma saída wmic

1

Eu quero criar arquivos de texto individuais de cada entrada em uma saída wmic.

Até agora eu tenho

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

que me fornece uma lista com o seguinte

Node,displayName
MAINCOMPUTER,Number1 Antivirus
MAINCOMPUTER,Number2 Antivirus
Node,displayName
MAINCOMPUTER,Number2 Antivirus
MAINCOMPUTER,Number1 Antispyware

O que eu quero fazer é criar uma série de arquivos de texto que seriam lidos

Number1 Antivirus.txt
Number2 Antivirus.txt
Number1 Antispyware.txt

sem ter duplicatas, sem sobrescrever quaisquer arquivos existentes e sem salvar os cabeçalhos "Nó, displayName" criados cada vez que o wmic é executado ...

Agora eu tenho lutado com isso por alguns dias e descobri uma enorme confusão de arquivos que depende muito de criar arquivos temporários e excluí-los depois ... não é elegante, excessivamente complicado, eu odeio isso . Então, eu estou querendo saber se algum assistente por aqui teria uma solução mais simples?

Aqui está a bagunça que eu fiz até agora. Não olhe muito de perto para a codificação de má qualidade.

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

Gosta!

    
por Flaver-D 01.06.2017 / 23:47

2 respostas

2

Se eu entendi direito o que você tenta realizar, esse lote funcionará:

@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)
  • Não há necessidade de arquivos temporários e classificação,
  • analisando diretamente a saída wmic com for /f e
  • skip=1 para se livrar do cabeçalho,
  • tokens=1,2 delims=," para dividir as linhas e armazenar node para %%A e displayname para %%B
  • find para verificar se a entrada já está presente no arquivo de destino.

EDIT3 Lote fixo, deve funcionar agora.

    
por 02.06.2017 / 21:02
2

Aqui está o que eu finalmente consegui fazer

Não tão legal quanto a resposta acima, mas ainda funciona.

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")    

Mas, como gosto de scripts de linha única, descartarei essa solução para a mais limpa possível

    
por 05.06.2017 / 00:34