1

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

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

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

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

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

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

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!"=="!Последняя линия!"эхо!thisline!>>% выходной_файл%
установить 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 ответа2

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 Исправлена партия, теперь должно работать.

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

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .