前提・実現したいこと
旧バージョンのアプリがインストールされていればアンインストールしてからサイレントインストールし、
インストールされていない場合はサイレントインストールしたい
インストールファイルは.msi
スクリプトはpoweshellで作成
作成したスクリプト(hogehoge.ps1)を管理者権限で起動するためバッチファイル(下記)を作成
powershell -NoProfile -ExecutionPolicy Unrestricted .\hogehoge.ps1
発生している問題・エラーメッセージ
おそらくアプリケーションインストール有無の確認とアンインストール動作は問題ないが、.msiファイルをサイレントインストール時にエラーが出てインストールできない
powershell
1Start-Process : このコマンドは、次のエラーのため実行できません: この操作に対して指定されたファイルには、アプリケーションが関連付けられていません。。 2+ Start-Process -filepath "$HOME\hogehoge.msi" -ArgumentList ...
該当のソースコード
powershell
1#旧バージョンがインストールされている場合はアンインストールする 2if (Test-Path HKLM:\"SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\{***-***-***-***}") 3{ 4Get-CimInstance -Class Win32_Product -Filter "Name='hogehogehoge'" | Invoke-CimMethod -MethodName Uninstall 5Start-Process -filepath "$HOME\hogehoge.msi" -ArgumentList "/q" -Verb runas 6} 7else 8 { 9Start-Process -filepath "$HOME\hogehoge.msi" -ArgumentList "/q" -Verb runas 10}
試したこと
管理者権限でpowershellを起動して下記コマンド単体だと成功した
Invoke-Expression "$env:UserProfile\hogehoge.msi /q"
(元々Invoke-Expression コマンドでコードを書いていた)
また、管理者権限で起動したコマンドプロンプトでは下記で動作した
c:\Users\username\hogehoge.msi /q
上記からpowershellでも管理者権限で.msiを起動しなければダメなのでは?と考えInvoke-Expressionだと管理者権限で起動できない?と考えて
Start-Process下記を.ps1に記載し、-Verb runasで管理者権限で起動するように書いたが上記のエラーメッセージがpowershell ISEで出る
(そもそもバッチファイルで作成した.ps1ファイルを管理者権限でpowershell起動しているはずなのに、.msiファイルも管理者権限起動させないといけないの?とも思っている)
Start-Process -filepath "$HOME\hogehoge.msi" -ArgumentList "/q" -Verb runas
[-Verb runas]は start-processで指定した.msiファイルを管理者で起動できると考えて記載している
-ArgumentList "/q"でサイレントインストールできると考えて記載している
補足情報
Start-Process -filepath "$HOME\hogehoge.msi"
上記コマンド記載だけだとpowershellから.msiが対話式で起動する
あなたの回答
tips
プレビュー