Autoit プログラミングWindows 10Windows 11

インストールされている更新プログラムを取得してコンボボックスに表示する|Autoit

今回は、Autoit プログラミングで Windows 10 や Windows 11 にインストールされている更新プログラムを取得し、取得した更新プログラムのデータをコンボボックスに表示するサンプルコードを紹介します。

スポンサーリンク

仕組み

更新プログラムの取得には、PowerShell の Get-WmiObject コマンドを使用しています。

コマンドプロンプトで「powershell Get-WmiObject -Class Win32_QuickFixEngineering」と入力して Enter を押すと、更新プログラムのリストが表示されますので、このリストから正規表現を使って HotFixIID を取得します。

コンボボックスに HotFixIID が表示されています。

任意の HotFixIID を選択し、OK ボタンをクリックすると、選択した文字をメッセージボックスで表示します。

サンプルコード

#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <Constants.au3>

Global $HotFix[1]; 一次元配列の宣言
$txt = ""

; コマンドを実行します。
; $STDOUT_CHILD = 子プロセスのSTDOUTストリームにハンドルを渡します。
$iPID = Run(@ComSpec & " /c " & "powershell Get-WmiObject -Class Win32_QuickFixEngineering", "", @SW_HIDE, $STDOUT_CHILD)

; 実行した子プロセスの STDOUT ストリームを読み取り、変数 $txt に代入します。
While 1
    $line = StdoutRead($iPID)
    If @error Then ExitLoop
    $txt &= $line
WEnd

$array = StringRegExp($txt, "Update\h+(KB\d+)", 3); 更新プログラムの HotFixIID を取得します。
ReDim $HotFix[UBound($array)]; 配列のサイズを更新プログラムの数に合わせて変更します。

$Form = GUICreate("HotFix")
$iComboBox = GUICtrlCreateCombo("", 10, 30); コンボボックスを作成
$iButton = GUICtrlCreateButton("OK", 220, 30)

; コンボボックスに取得した HotFixIID をセットします。
For $i = 0 To UBound($array) - 1
    $HotFix[$i] = $array[$i]
    GUICtrlSetData($iComboBox, $HotFix[$i] & "|")
Next

GUISetState(@SW_SHOW)

While 1
    Switch GUIGetMsg()
        Case $GUI_EVENT_CLOSE
            ExitLoop
        Case $iButton; OK ボタンをクリックすると、コンボボックスに表示されている文字をメッセージボックスで表示します。
            MsgBox(0, 0, GUICtrlRead($iComboBox), 0, $Form)
    EndSwitch
WEnd

コードの解説

Run 関数と StdoutRead 関数

StdoutRead 関数使用すると、Run 関数で実行したコマンドのデータを取得することが出来ます。

コマンドで「powershell Get-WmiObject -Class Win32_QuickFixEngineering>a.txt」のように、テキストファイルを出力して、テキストファイルの中身を FileOpen, FileRead, FileClose 関数で読み込まなくてもいいので、便利です。

ReDim (Keyword)

このコードで使用している ReDim は、配列のサイズ変更することが出来ます。

今回のようにこれから数が増えていく更新プログラムなどは、どれだけ数を増やせばいいのかがわかりません。

こういう時に ReDim を使うと便利です。

$array = StringRegExp($txt, “Update\h+(KB\d+)”, 3)

StringRegExp 関数で更新プログラムの HotFixIID を取得し、変数 $array には、配列が返されます。

変数 $array の中の各配列には、HotFixIID が格納されています。

ReDim $HotFix[UBound($array)]

UBound 関数で変数 $array の配列の要素数を取得し、この取得した要素数がインストールされている更新プログラムの数なので、ReDim で変数 $HotFix の配列のサイズを更新プログラムの数に変更しています。

データのセット

For $i = 0 To UBound($array) – 1
$HotFix[$i] = $array[$i]
GUICtrlSetData($iComboBox, $HotFix[$i] & “|”)
Next

変数 $array の中に格納されている HotFixIID を変数 $HotFix に代入しています。

気付いた方もいるかと思いますが、実は ReDim や 変数 $HotFix は必要ありません。

次のように書いても全く同じ動作をします。

For $i = 0 To UBound($array) – 1
GUICtrlSetData($iComboBox, $array[$i] & “|”)
Next

今回のコードを見れば ReDim の使い方が理解しやすいと思いましたので、わざと無駄なコードを入れました。

今回は、プログラムの起動時にデータを取得していますが、ボタンを押したらデータを取得するなど、いろいろとコードを変更してみてください。

コメント

タイトルとURLをコピーしました