.NET 4、スナップイン、ASP.NET MVC 3などのアプリケーションをインストールしたいのですがどうすればアプリケーションをインストールして、インストールが成功したかどうかを判断する値を返しますか?Windowsインストーラを実行し、PowerShellで成功/失敗の値を取得するにはどうすればよいですか?
答えて
に依存します。 MSIはWMIを使用してインストールできます。 exesやその他のメソッドでは、Start-Processを使用してProcess ExitCodeをチェックすることができます。
MSIのも、MSUのは、Wusa.exeによりを使用してインストールすることができます。msiexec.exeを使用してインストールすることができ、両方が/quiet
スイッチ、/norestart
と/forcerestart
スイッチとログインするための/log
オプション(ファイル名を指定する)を持っています。
あなたは/?
注意してそれらを呼び出す場合は、オプションの詳細を読むことができます:彼らは失敗したときにWUSAが黙って失敗したので、あなたが成功したかどうかを判断するために、ログファイルやイベントログを確認する必要があります。
私は現在のプロジェクトで探しているものを正確に実装しました。私たちは、複数の環境とデータセンターにまたがるn個のアプリケーションの導入と注入を自動化する必要があります。これらのスクリプトは、完全なコードが1000行に達していますが、コア機能はそのままであるため、簡単にするために元のバージョンから少し変更されています。私はこれがあなたが求めていることを願っています。
このPS機能は、すべてのアプリケーションをレジストリから削除します(追加/削除プログラムの読み込み)。その後、提供されたアプリケーション名と表示バージョンを検索します。私のコード(PSM1)では、インストールする前にこの機能を実行し、それがインストールされているかどうかを確認します。このすべては、1つのマスタ機能でマネージャのフロー制御にラップすることができます。
function Confirm-AppInstall{
param($AppName,$AppVersion)
$Apps = Get-ItemProperty Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\*|?{$_.DisplayName -ne $Null}|?{$_.DisplayName -ne ""}
$Apps += Get-ItemProperty Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\*|?{$_.DisplayName -ne $Null}|?{$_.DisplayName -ne ""}
$Installed = $Apps|?{$_.DisplayName -eq ""}|?{$_.DisplayVersion -eq ""}|select -First 1
if($Installed -ne $null){return $true}else{return $false}
}
このPS関数は、インストールコマンドが事前入力済みのtxtファイルを読み込みます(1行に1コマンド)。個々の行を個別に実行し、インストールが完了するのを待ってから次の行に進みます。
function Install-Application{
param($InstallList = "C:\Install_Apps_CMDS.txt")
$list = gc -Path $InstallList
foreach ($Command in $list){
Write-Output ("[{0}]{1}" -f (Get-Date -Format G),$call)
#Make install process wait for exit before continuing.
$p = [diagnostics.process]::Start("powershell.exe","-NoProfile -NoLogo -Command $Command")
$p.WaitForExit()
Start-Sleep -Seconds 2
#Searches for the installer exe or msi that was directly opened by powershell and gets the process id.
$ProcessID = (gwmi -Query ("select ProcessId from Win32_Process WHERE ParentProcessID = {0} AND Name = '{1}'" -f $p.Id,$ParentProcessFile)|select ProcessId).ProcessId
#waits for the exe or msi to finish installing
while ((Get-Process -Id $ProcessID -ea 0) -ne $null){
Start-Sleep -Seconds 2
$ElapsedTime = [int](New-TimeSpan -Start $P.StartTime -End (Get-Date)|select TotalSeconds).TotalSeconds
#install times out after 1000 seconds so it dosent just sit their forever this can be changed
if(2000 -lt $ElapsedTime){
Write-Output ('[{0}] The application "{1}" timed out during instilation and was forcfully exited after {2} seconds.' -f (Get-Date -Format G),$App.Name,(([int]$App.InstallTimeOut) * 60))
break
}
}
#clean up any old or hung install proccess that should not be running at this point.
Stop-Process -Name $ParentProcessName -ea 0 -Force
Stop-Process -Name msiexec -ea 0 -Force
}
}
TXTファイルは次のようにフォーマットする必要があります。各アプリケーションのインストール方法を調べる必要があります。優れたリソースは、私は、独自の値を削除し、これはもう少し単純化するために、私の既存のコードを変更する必要がありましたエラーがないかどうか、私に教えてくださいappdeploy.com
C:\Install.exe /q
C:\install.msi /qn TRANSFORMS='C:\transform.mst'
C:\install2.msi /qn /norestart
C:\install3.exe /quiet
です。カスタムのXML回答シートから私の価値を引き出しています。しかし、このコードは私がそれを供給したときにうまくいくはずです。
私の実装についてもっと議論したいなら、私に教えてください。私は詳細な説明をし、私が実装したサポート機能を追加することもできます。
これらの回答はすべて、あまりに複雑すぎるか、不十分であるようです。 PowerShellコンソールでインストーラを実行するには、いくつか問題があります。 MSIはWindows subsystemで実行されるため、呼び出すことはできません(Invoke-Expression
または&
)。一部の人々は、これらのコマンドをOut-Null
またはOut-Host
に配管することで機能させると主張していますが、動作することは確認されていません。
私にとって有効な方法はStart-Process
で、サイレントインストールのパラメータはmsiexec
です。
$list =
@(
"/I `"$msi`"", # Install this MSI
"/QN", # Quietly, without a UI
"/L*V `"$ENV:TEMP\$name.log`"" # Verbose output to this log
)
Start-Process -FilePath "msiexec" -ArgumentList $list -Wait
あなたはStart-Process
コマンドからexit codeを取得し、/値を不合格合格のためにそれを検査することができます。 (そしてここにはexit code referenceがあります)
- 1. ディスパッチで失敗したリクエストの値を取得するにはどうすればよいですか?
- 2. pythonスクリプトから戻り値(成功/失敗)を出力するにはどうすればいいですか?
- 3. 成功または失敗をHaskellのオペレーティングシステムに戻すにはどうすればよいですか?
- 4. 実行するPowerShellスクリプトのディレクトリを取得するにはどうすればよいですか?
- 5. Windows 7でTest-NetConnectionなどのPowerShell 4コマンドレットを取得するにはどうすればよいですか?
- 6. C#HttpRequestシーケンスはFiddlerの実行中に成功しますが、そうでなければ失敗します。
- 7. 認証に成功した後にセッショントークンを取得するにはどうすればよいですか?
- 8. 失敗したjQueryリクエストから例外メッセージを取得するにはどうすればよいですか?
- 9. CruiseControl:コマンドラインから実行=成功、Windowsサービス=失敗
- 10. Spark:ステージが失敗した元のデータを取得するにはどうすればよいですか?
- 11. Windows 8のPowerShellからMetro-Appを実行するにはどうすればよいですか?
- 12. テストが失敗したときにMavenゴールを実行するにはどうすればよいですか?
- 13. タスクが失敗した場合にAntコマンドを実行するにはどうすればよいですか?
- 14. 実行時にWindowsサービスの名前を取得するにはどうすればよいですか?
- 15. 成功した実行に成功\失敗が必要ないFunction \ Methodの名前は何ですか?
- 16. antで実行してもテストは成功しますが、Mavenで実行すると失敗しますか?
- 17. Windowsでチェックサムを実行するにはどうすればよいですか?
- 18. Windowsでツイストトライアルを実行するにはどうすればよいですか?
- 19. Windowsで失敗したログオンの試みを監視するにはどうすればよいですか?
- 20. 実行時に「Option Compare」の値を取得するにはどうすればよいですか?
- 21. 1人のインストーラでJava EE Webアプリケーションのインストーラを作成するにはどうすればよいですか?
- 22. インストーラを作成せずにC#Windowsサービスをインストールするにはどうすればよいですか?
- 23. のJUnitを実行するためにどのようにメソッドを失敗に成功
- 24. DynamicControlの値を取得するにはどうすればよいですか?
- 25. Windowsの%APPDATA%location変数の値をJavaで取得するにはどうすればよいですか?
- 26. WindowsでSDカードの実際のサイズを取得するにはどうすればよいですか?
- 27. Windows 10 HWAバンドルのインストーラを作成するにはどうすればよいですか?
- 28. バッチスクリプトを実行しているドライブ文字を取得するにはどうすればよいですか?
- 29. Android:プログラムでインストーラのファイル名を取得するにはどうすればよいですか?
- 30. PowerShellで拡張子なしのファイルパスを取得するにはどうすればよいですか?