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
一時停止
うわぁ!
あなたが達成しようとしていることを私が正しく理解していれば、このバッチは次のことを行います。
@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バッチを修正しましたが、動作するはずです。
これが私が最終的に作ったものです
上記の答えほど良くはありませんが、それでも機能します。
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行のスクリプトが好きなので、このソリューションを捨てて、最もきれいに見えるものにします。