我用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"
答案 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" }
希望有所帮助