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

检查程序是否已安装,如果已安装,请转到下一个powershell,powershell,Powershell,我在谷歌上搜索了一下,没有发现任何对我有用的东西 我有4个msi文件要安装,但想检查计算机上是否安装了部分msi文件 例如: 检查是否安装了程序1,如果没有安装,请转到并安装程序2。 但是,如果没有安装,请安装它,然后转到程序2并在那里执行相同的测试 Execute-MSI -Action Install -Path "$dirFiles\Program1" Execute-MSI -Action Install -Path "$dirFiles\Program2" Execute-MSI -A

我在谷歌上搜索了一下,没有发现任何对我有用的东西

我有4个msi文件要安装,但想检查计算机上是否安装了部分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"

如果知道GUID,可以测试路径。另外,不要忘记,如果您的操作系统是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"}

在不了解任何应用程序的情况下,我可以想到两个简单的选择

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

您可以使用
WMI
检查您的MSI是否已安装。例如:

$products = Get-WmiObject -Class win32_product |  Where-Object { $_.Name -like "*someName*" } | Select-Object *
PS> $found = $results.Where({ $_.Name -like "*sw1*"}) 
PS> if ($found) { Write-Host "Found" }
您可以使用其他要查询的模式扩展
Where Object
子句(例如,通过
$\.Name-like“*Sw1*”-或$\.Name-like“*Sw2*”
)<代码>$products应该是一个包含结果的数组,您可以使用该数组检查请求的软件是否已安装。例如:

$products = Get-WmiObject -Class win32_product |  Where-Object { $_.Name -like "*someName*" } | Select-Object *
PS> $found = $results.Where({ $_.Name -like "*sw1*"}) 
PS> if ($found) { Write-Host "Found" }

希望这有帮助

嗨,你写代码了吗?我们需要看到它来帮助你。你可以把它包括进去,我已经做到了。如何对此进行检查。请小心使用
Win32_产品
,每次调用它时,它都会在所有MSI上运行修复。因此,至少它通常是非常缓慢的。