2017-01-27 1 views
2

として、それらを別々のラインで複数のテキストを検索し、出力\アンインストール/ S^| Find/I "DisplayName"バッチコマンド - 私は</p> <p>のRegクエリます。HKLM Software Microsoft Windowsの CurrentVersionのREGコマンドに続いてドメインのPCにインストールされているソフトウェアのインベントリを作成しようとしている列

ソフトウェア名を取得するためにFind/I "DisplayName"を使用しています。私はバージョン番号が必要です(そして後ほどいくつかのフィールドが追加されることもあります)が、DisplayVersionという別の行にあります。

私は複数のコンピュータ上でこれを実行していますので、私のスクリプトは次のようになります。

for /f %%i in (computers_ALL.txt) do (

for /f "tokens=1,2,*" %%j in ('psexec \\%%i Reg Query HKLM\Software\Microsoft\Windows\CurrentVersion\Uninstall /S ^| Find /I "DisplayName"') do (
    echo x64 %%i %%l >>%OUTPUT_FILE% 
    ) 

for /f "tokens=1,2,*" %%j in ('psexec \\%%i Reg Query HKLM\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall /S ^| Find /I "DisplayName"') do (
    echo x86 %%i %%l >>%OUTPUT_FILE% 
    ) 
) 

今、私は唯一のDisplayNameを見つけることができます。他の行にあるDisplayVersionを見つけて2番目の列に追加するにはどうしたらいいですか?私の出力は、私は、ソフトウェアの名前件まで世話をすることができますコンピュータ名、プラットフォーム(32-64ビット)、ソフトウェア名、ソフトウェアバージョン

、のようなものが、バージョンを取得し、2列目にそれを置くために苦労します。あなたの助けに感謝。ありがとう。

答えて

0
@ECHO OFF 
SETLOCAL 
SET "output_file=u:\report.txt" 
DEL "%output_file%" /F /Q 
for /f %%i in (q41887529.txt) do (
SET "compname=%%i" 
CALL :clrsoft 
FOR %%z IN (\ \Wow6432Node\) DO ( 
    for /f "tokens=1,2,*" %%j in (
    'Reg Query HKLM\Software%%zMicrosoft\Windows\CurrentVersion\Uninstall /S ^| Findstr /I "DisplayName DisplayVersion HKEY_LOCAL_MACHINE\\"' 
    ) do (
    IF /i "%%j"=="Displayname" (
    SET "softname=%%l" 
    ) ELSE (
    IF /i "%%j"=="Displayversion" (
     SET "softver=%%l" 
    ) ELSE (
     CALL :report %%z 
    ) 
    ) 
) 
REM processed all data - final report 
CALL :report %%z 
) 
) 

GOTO :EOF 

:: Report routine parameters : 
:: %1 indicates x64 ("\") or x86 (\Wow6432Node\) 

:report 
IF NOT DEFINED softname GOTO clrsoft 
IF "%1"=="\" (
ECHO "%compname%",x64,"%softname%","%softver%">>"%output_file%" 
) ELSE (
ECHO "%compname%",x86,"%softname%","%softver%">>"%output_file%" 
) 
:clrsoft 
SET "softname=" 
SET "softver=" 
GOTO :EOF 

もちろん、独自の出力ファイル名を設定する必要があります。 psexec \\%%iも削除し、私のマシンでのテストのために自分のマシン名をq41887529.txtに設定しました。

クエリの唯一の違いはノードなので、ステップを組み合わせて%%zを使用して制御しました。

tempvarsをクリアしてから、3つのターゲット文字列のいずれかの各戻り行を処理します。

それが名前だ場合、それはバージョンだ場合は、バージョンを記録し、名前を録音

、蓄積されたデータを報告するために:reportを呼び出し、このことからすると、今それを報告し、私たちにペアを与える必要があります。

もしどちらでもない場合は、それは新しい鍵でなければならないので、これまでに行ったことを報告してください。

厄介な点は、バージョンが存在する必要はなく、最後のエントリにはバージョンがない可能性があるため、蓄積されたデータが確実に出力されるように再度レポートを試みます。

私は今これを改訂し、元のものに置き換えました。

ファイルから抽出されたマシン名が報告され、しばしば欠落しているバージョン番号が修正されていると思われます。名前とバージョンの順序は予測できないため、インスタンスはHKEY_そして最後に。

+0

ありがとう。これは、私が必要とするデータを抽出するための良い方法です。私は少し問題がある。コンピュータ名が来ていないし、バージョン番号も来ていない。 32/64プラットフォームで、ソフトウェア名のみが出力ファイルに保存されています。 – arifr

0

次のスクリプトは、ローカルのWindowsマシンに対して機能します。リストcomputers_ALL.txt"%computername%"の代わりに適用し、psexec \\%_comp%を追加するのは簡単な作業です。

@ECHO OFF 
SETLOCAL EnableExtensions DisableDelayedExpansion 
set "OUTPUT_FILE=%temp%\41887529.txt" 
for /F %%i in ("%computername%") do (
    set "_comp=%%i" 
    call :proHive "x64" "\Software\Microsoft\Windows\CurrentVersion\Uninstall" 
    call :proHive "x86" "\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall" 
) 

rem debugging output 
type "%OUTPUT_FILE%" 
ENDLOCAL 
goto :eof 

:proHive 
rem %1 platform 
rem %2 registry key 
>>"%OUTPUT_FILE%" (
for /f "tokens=*" %%G in (' 
    Reg Query "HKLM%~2" /S /V DisplayName ^| Find /I "HKEY_LOCAL_MACHINE%~2" 
    ') do (
    set "_DisplayName=" 
    set "_DisplayVersion=" 
    for /f "tokens=1,2,*" %%j in (' 
     Reg Query "%%G" ^| Findstr /I "DisplayName\> DisplayVersion\>"') do set "_%%j=%%l" 
    SETLOCAL EnableDelayedExpansion 
     echo %_comp%,%~1,!_DisplayVersion!,!_DisplayName! 
    ENDLOCAL 
) 
) 
goto :eof 
関連する問題