2017-02-14 52 views
-1

我google了,沒有發現任何有用的東西。檢查程序是否安裝,如果是這樣,轉到下一個powershell

我有4個msi文件我想要安裝,但想檢查它是否安裝在電腦上。

例如: 檢查是否安裝程序1,如果不安裝它,去,如果不是安裝了安裝程序2. 然而,安裝它,並轉到程序2,做相同的測試那裏。

Execute-MSI -Action Install -Path "$dirFiles\Program1" 
Execute-MSI -Action Install -Path "$dirFiles\Program2" 
Execute-MSI -Action Install -Path "$dirFiles\Program3" 
Execute-MSI -Action Install -Path "$dirFiles\Program4" 
+2

嗨,你寫過_any_驗證碼?我們需要看到它來幫助你。你可以[編輯你的問題](http://stackoverflow.com/posts/42228400/edit)包含它。 – sodawillow

+0

我已經做到了。我如何執行此檢查。 – jetmanus

回答

0

如果您知道GUID,則可以測試路徑uninstall key。另外不要忘記,如果你的操作系統是64位,那麼對於32位應用程序,WOW6432Node將會有相同的密鑰。

$uninstallkey = "HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall\" 
$uninstall32key = "HKLM:\Software\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall\" 
#Example 64-bit app 
$app1guid = "{XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}" 
if (!(Test-Path "$uninstallkey\$app1guid)) {Execute-MSI -Action Install -Path "$dirFiles\Program1"} 
#Example 32-bit app 
$app2guid = "{XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}" 
if (!(Test-Path "$uninstall32key\$app2guid)) {Execute-MSI -Action Install -Path "$dirFiles\Program1"} 
+0

這是天才非常感謝你 – jetmanus

0

不知道任何關於您的應用程序,有兩個簡單的選項,我能想到的。

1)讀取日誌文件,查找模式/字符串 - 檢查6次(根據需要進行配置),如果未完成則檢查失敗。如果是這樣,移動到下一個安裝,做同樣的檢查

 $LOGFILE = 'C:\Somewhere.log' 
    $Complete = 'no' 
    $Counter = 1 
    $max = 6 

Start-Sleep 10 

    DO { 

    $Check = SELECT-STRING -pattern 'status: 0.' -path $logfile -quiet 
    write-host $Check 
    If (($Check) -eq $True) { 
    Set-Variable -name Complete -Value "yes" 
     } 
      Else {Set-Variable -name Complete -Value 'no'} 
       Write-host $Counter 
       Start-Sleep 20 
       $Counter++ 
          } 

      while ($Complete -eq 'no') 

       If (($Counter) -eq $max) { 

    Throw 'Installation failed, check the error log' 

     } 

選項2)

如果你知道哪些目錄它創建,甚至一個文件數,可以做一些像上面用計數而不是文件讀取

$PRDIR = "D:\Folder" 
    If (($PRDIR.Count) -gt 2) 
    { 
Do something 
} 
Else 
{ 
Do something else 
{ 

希望有所幫助!

[R

0

您可以使用WMI檢查您的MSI安裝與否。例如:

$products = Get-WmiObject -Class win32_product | Where-Object { $_.Name -like "*someName*" } | Select-Object * 

您可能延伸,以與附加的圖案Where-Object子句來查詢(例如,經由$_.Name -like "*Sw1*" -or $_.Name -like "*Sw2*")。 $products應該是包含調查結果的數組,您可以使用它來檢查是否安裝了所請求的軟件。例如:

PS> $found = $results.Where({ $_.Name -like "*sw1*"}) 
PS> if ($found) { Write-Host "Found" } 

希望幫助

+0

小心使用'Win32_Product',每次它被調用時它會在所有MSI上運行修復。所以至少它通常很慢。 – BenH

相關問題