2017-06-22 2 views
1

Ich bin ein PowerShell-Noob. Entschuldigung im Voraus. Ich versuche, ein schnelles Skript zu schreiben, das einen PC überprüft, um zu sehen, ob eine Liste von Anwendungen installiert ist. Ich speichere die Liste in einem Array und vergleiche sie mit dem DisplayName von Apps in den Uninstall Keys in der Registrierung.Teilweise Übereinstimmung der Anwendung DisplayNames in der Windows-Registrierung?

Dies funktioniert, aber nur für exakte Übereinstimmungen. "Blender" und "Paint.net" werden in der Ausgabe aufgeführt, nicht aber in SketchUp, da der vollständige Anzeigename "SketchUp 2017" ist. Wie erreiche ich, dass Keywords unabhängig vom anderen Text (Versionsnummern) im DisplayName übereinstimmen? Ich habe versucht, Wildcards um die $ _. DisplayName-Eigenschaft zu verwenden, aber sie geben entweder einen Fehler aus oder geben überhaupt nichts zurück. Ich möchte das Skript nicht jedes Mal aktualisieren müssen, wenn die Version von Audacity ein paar Stufen höher klickt.

Dies ist wahrscheinlich etwas einfaches, wie erweiterte Eigenschaften oder etwas, aber es ist außerhalb meiner Reichweite. Deine Hilfe wird geschätzt.

+0

Eine allgemeine Powershell-Frage, aber ich kann keine gute Antwort finden, um zu verbinden. Sie können (a) gegen (m) vergleichen - eine Sache gegen die andere prüfen. Sie können (a, b, c, d) mit (m) vergleichen - das hat ein Standardverhalten, wenn irgendetwas in (a, b, c, d) mit (m) übereinstimmt, dann lösen Sie eine Antwort aus. Aber Sie versuchen, (a, b, c, d) in einem Zug mit (m, n, o, p) zu vergleichen und eine Antwort zu erhalten - Sie können nicht, was wäre die Ausgabe? Sie benötigen zwei Schleifen. – TessellatingHeckler

Antwort

3

Was Sie tun können, ist einen regulären Ausdruck aus Ihrem $Apps Array zu machen, und verwenden Sie -match dagegen. Sie müssen Ihre Zeichenfolgen umgehen, um Sonderzeichen zu berücksichtigen, und sie mit einer Pipe verbinden (in RegEx ist dies der Operator or).

[email protected]('Paint.net', 'Blender', 'SketchUp') 
$AppsRegEx = ($Apps | ForEach{[regex]::escape($_)}) -join '|' 

Get-ItemProperty HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall\* | 
    Where-Object {$_.DisplayName -match $AppsRegEx} | 
    Select-Object DisplayName, DisplayVersion 

Das sollte Keywords für Sie übereinstimmen.

+0

Das hat den Trick gemacht! Vielen Dank. –

Verwandte Themen