Как создать отдельные текстовые файлы из вывода 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")
Но так как мне нравятся однострочные сценарии, я оставлю это решение на чистейшем