web-dev-qa-db-ja.com

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アンチウイルス
MAINCOMPUTER、Number2アンチウイルス
Node、displayName
MAINCOMPUTER、Number2アンチウイルス
MAINCOMPUTER、Number1スパイウェア対策

私がやりたいのは、ラベル付けされる一連のテキストファイルを作成することです

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
::空白を削除します
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

処理するエコーファイル
エコー。
type%inputfile%
エコー。

存在する場合sorted.txtdelsorted.txt
sort%inputfile%/ O%temp%\ sorted.txt

存在する場合%outputfile%del%outputfile%
set lastline =
for/f "delims ==" %% L in(sorted.txt)do(
set thisline = %% L
「!thisline!」== "!lastline!"でない場合echo!thisline!>>%outputfile%
set lastline = %% L

デルsorted.txt

エコー重複が削除されました:
エコー。
setlocal disabledelayedexpansion

::ヘッダーを削除
ren AVlist2.txt AVlist2.txt.old
findstr/v/b/c: "Node、displayName" AVlist2.txt.old> AVlist2.txt
type avlist2.txt
一時停止

うわぁ!

1
Flaver-D

あなたが達成しようとしていることを私が正しく理解していれば、このバッチは次のことを行います。

@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%%Aに、displayname%%Bに格納します
  • findは、エントリが宛先ファイルにすでに存在するかどうかを確認します。

EDITバッチを修正しましたが、動作するはずです。

2
LotPings

これが私が最終的に作ったものです

上記の答えほど良くはありませんが、それでも機能します。

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

しかし、私は1行のスクリプトが好きなので、このソリューションを捨てて、最もきれいに見えるものにします。

2
Flaver-D