0
0

msiのプロパティをPowerShellから編集する

Posted at

結論(完成したコード)

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ってなんとなくカッコいい響きで好きだけど使うことはほぼないしなんとなくとっつきづらい

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0