检查程序是否已安装,如果是,请转到下一个PowerShell

时间:2017-02-14 14:13:00

标签: powershell

我用Google搜索,但没有找到对我有用的东西。

我想安装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"

3 个答案:

答案 0 :(得分:0)

如果你知道GUID,你可以测试uninstall key的路径。另外请不要忘记,如果您的操作系统是64位,则WOW6432Node中的32位应用程序将使用相同的密钥。

$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"}

答案 1 :(得分: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)

如果您知道它创建的目录甚至是文件计数,可以使用count而不是文件读取来执行上述操作

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

希望有所帮助!

[R

答案 2 :(得分: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应该是一个包含调查结果的数组,您可以使用它来检查是否安装了请求的SW。例如:

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

希望有所帮助