今回は、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 の使い方が理解しやすいと思いましたので、わざと無駄なコードを入れました。
今回は、プログラムの起動時にデータを取得していますが、ボタンを押したらデータを取得するなど、いろいろとコードを変更してみてください。
コメント