2017-02-14 79 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

相关问题