2016-12-27 4 views
2

Попытка сканирования удаляемых строк реестра для определенного программного обеспечения путем поиска с использованием -match значения DisplayName. Я могу заставить его работать с одним программным обеспечением, но у меня возникают проблемы с выяснением того, как заставить его работать со списком программного обеспечения. Например, я установил Java, Silverlight, Shockwave, Adobe Reader и Adobe Font Pack в качестве переменных, но не могу понять, как их закодировать через команду 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" 

ответ

3

Как вы используете оператор -match, вы можете использовать регулярные выражения или оператора. Вместо построения массива используйте строку, разделенную на трубы:

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

    } 

    .... 
+2

Вам не нужны отметки после труб. Пожалуйста, не используйте отметки (когда-либо), чтобы продолжить линию. –

Смежные вопросы