Powershell 循环中的循环?

Powershell 循环中的循环?,powershell,Powershell,尝试通过使用DisplayName值的-match搜索来扫描注册表中的卸载字符串以查找特定软件。我可以让它与一个软件一起工作,但我很难弄清楚如何让它与一系列软件一起工作。例如,我将Java、Silverlight、Shockwave、AdobeReader和AdobeFontPack设置为变量,但不知道如何通过foreach命令循环它们 $PATHS = @("HKLM:\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstal

尝试通过使用DisplayName值的-match搜索来扫描注册表中的卸载字符串以查找特定软件。我可以让它与一个软件一起工作,但我很难弄清楚如何让它与一系列软件一起工作。例如,我将Java、Silverlight、Shockwave、AdobeReader和AdobeFontPack设置为变量,但不知道如何通过
foreach
命令循环它们

$PATHS = @("HKLM:\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall",
           "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall")

# Java 8 Update 102 | 8.0.1020.14
$Javax86 = "Java 8"

# Microsoft Silverlight | 5.1.50901.0
$MSsilverlight = "Microsoft Silverlight"

# Adobe Shockwave Player 12.2 | 12.2.5.195
$AdobeShockwave = "Adobe Shockwave Player"

# Extended Asian Language font pack for Adobe Acrobat Reader DC | 15.007.20033
$AdobeReaderFont = "font pack for Adobe Acrobat Reader"

# Adobe Acrobat Reader DC MUI | 15.020.20042
$AdobeReader = "Adobe Acrobat Reader DC MUI"

$SOFTWARE = "" 
#@($Javax86,$MSsilverlight,$AdobeShockwave,$AdobeReaderFont,$AdobeReader)

foreach ($path in $PATHS) {
    $installed = Get-ChildItem -Path $path |
                 foreach { Get-ItemProperty $_.PSPath } |
                 Where-Object { $_.DisplayName -match "$MSsilverlight" } |
                 Select-Object -Property DisplayName,DisplayVersion

    foreach ($app in $installed) {
        $DisplayName = "$($app.DisplayName)"
        $DisplayVersion = "$($app.DisplayVersion)"
    }

    if ($app.DisplayName) {
        $InstalledYes = "$DisplayName ($DisplayVersion) is installed"
    } elseif ($app.DisplayName -eq $NULL) {
        $InstalledNo = "$MSsilverlight is not Installed"
        #Write-Host "$SOFTWARE is not installed"
    }
}

Write-Host "$InstalledYes"
Write-Host "$InstalledNo"

在使用
-match
操作符时,可以使用regex或操作符。不要构建阵列,而是使用管道分隔字符串:

$SOFTWARE = "$Javax86|$MSsilverlight|$AdobeShockwave|$AdobeReaderFont|$AdobeReader"

ForEach ($path in $PATHS) {

    $installed = Get-ChildItem -Path $path | 
                 ForEach { Get-ItemProperty $_.PSPath } | 
                 Where-Object { $_.DisplayName -match $SOFTWARE } | 
                 Select-Object -Property DisplayName,DisplayVersion

    ForEach ($app in $installed) {
       $DisplayName = "$($app.DisplayName)"
       $DisplayVersion = "$($app.DisplayVersion)"

    }

    ....

管道后面不需要打勾。请不要(永远)使用勾号继续一行。