結論(完成したコード)
code.ps1
function ModifyProperty {
# Execute SELECT
$view = $database.GetType().InvokeMember("OpenView", "InvokeMethod", $null, $database, "SELECT * FROM Property WHERE Property = '$propName'")
$view.GetType().InvokeMember("Execute", "InvokeMethod", $null, $view, $null)
# Fetch and View Close
$row = $view.GetType().InvokeMember("Fetch", "InvokeMethod", $null, $view, $null)
$view.GetType().InvokeMember("Close", "InvokeMethod", $null, $view, $null)
# Prepare SQL
if ($row -eq $null) {
$query = "INSERT INTO Property (Property, Value) VALUES ('$propName', '$value')"
} else {
$query = "UPDATE Property SET Value = '$value' WHERE Property = '$propName'"
}
# Execute SQL
$view = $database.GetType().InvokeMember("OpenView", "InvokeMethod", $null, $database, ($query))
$view.GetType().InvokeMember("Execute", "InvokeMethod", $null, $view, $null)
# View Close
$view.GetType().InvokeMember("Close", "InvokeMethod", $null, $view, $null)
}
# Create ComObject
$installer = New-Object -ComObject WindowsInstaller.Installer
# Open Database in msi
$msipath = Read-Host "input msi path"
$database = $installer.GetType().InvokeMember("OpenDatabase", "InvokeMethod", $null, $installer, @($msipath, 1))
# ModifyProperty
$propName = Read-Host "input PropertyName"
$value = Read-Host "input NewValue"
ModifyProperty
# DB Commit
$database.GetType().InvokeMember("Commit", "InvokeMethod", $null, $database, $null)
雑記
- VBScriptのコードはすぐ見つかったがもうすぐ(2027年?)使えなくなるらしい
- PowerShellのコードは読み込みはいっぱいあったが編集は見つからなかった
- ChatGPTに聞いたら上記のコードがほぼ出力されたが実行できないラインもあった
- ChatGPTのコードを元に試行錯誤して完成
- Orcaで結果を確認しながら作業したが、対象msiを開いたまま実行するとエラーになる(地味にハマった)
あとがき
PowerShellってなんとなくカッコいい響きで好きだけど使うことはほぼないしなんとなくとっつきづらい