Как создать отдельные текстовые файлы из вывода wmic

Я хочу создать отдельные текстовые файлы из каждой записи в выводе wmic.

Пока у меня есть

WMIC.exe / Узел:localhost / Пространство имен:\\root\SecurityCenter2 Путь AntiVirusProduct Получить displayName /Format:csv>AVlist.txt
WMIC.exe / Узел:localhost / Пространство имен:\\root\SecurityCenter2 Путь AntiSpywareProduct Получить displayName /Format:csv>>AVlist.txt

которые дают мне список со следующим

Узел, DISPLAYNAME
ГЛАВНЫЙ, № 1 Антивирус
ГЛАВНЫЙ, №2 Антивирус
Узел, DISPLAYNAME
ГЛАВНЫЙ, №2 Антивирус
ГЛАВНЫЙ КОМПЬЮТЕР, Number1 Антишпион

Что я хочу сделать, это создать серию текстовых файлов, которые будут помечены

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

без дубликатов, без перезаписи существующих файлов и без сохранения заголовков "Node, displayName", создаваемых при каждом запуске wmic...

Теперь я боролся с этим в течение нескольких дней и придумал огромный беспорядок в файле, который сильно зависит от создания временных файлов и их удаления после... не элегантного, чрезмерно сложного, я просто ненавижу это. Итак, мне интересно, есть ли у каких-нибудь волшебников здесь более простое решение?

Вот беспорядок, который я сделал до сих пор. Не смотрите слишком внимательно на дрянное кодирование.

WMIC.exe / Узел:localhost / Пространство имен:\\root\SecurityCenter2 Путь AntiVirusProduct Получить displayName /Format:csv>AVlist.txt
WMIC.EXE / Узел:localhost / Пространство имен:\\root\SecurityCenter2 Путь AntiSpywareProduct Получить displayName /Format:csv>>AVlist.txt
:: удалить пробелы
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

:: удалить дубликаты строк
setlocal enabledelayedexpansion
set inputfile = AVlist.txt
set outputfile = AVlist2.txt

эхо-файл для обработки
эхо.
введите% inputfile%
эхо.

если существует sorted.txt del sorted.txt
sort% inputfile% / O% temp% \ sorted.txt

если существует% outputfile% del% outputfile%
установить lastline =
for / f "delims ==" %% L in (sorted.txt) do (
установить эту линию =%%L
если не "!thisline!"=="!lastline!" echo!thisline!>>%outputfile%
установить lastline =%%L
)

del sorted.txt

эхо Дубликаты удалены:
эхо.
setlocal disabledelayedexpansion

:: удалить заголовок
ren AVlist2.txt AVlist2.txt.old
findstr / v / b / c: "Node, displayName" AVlist2.txt.old> AVlist2.txt
введите avlist2.txt
Пауза

Хлоп!

2 ответа

Решение

Если я правильно понимаю, что вы пытаетесь выполнить, эта партия будет делать:

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

  • Нет необходимости во временных файлах и сортировке,
  • непосредственно анализирует вывод wmic с for /f а также
  • skip=1 избавиться от заголовка,
  • tokens=1,2 delims=," разбить линии и хранить node в %%A а также displayname в %%B
  • find проверить, присутствует ли запись в файле назначения.

EDIT3 Исправлена ​​партия, теперь должно работать.

Вот что я наконец-то сделал

Не так хорошо, как ответ выше, но это все еще работает.

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

Но так как мне нравятся однострочные сценарии, я оставлю это решение на чистейшем

Другие вопросы по тегам