2017-06-22 36 views
1

我是PowerShell noob。提前對不起。我正在嘗試編寫一個快速腳本來檢查PC是否安裝了應用程序列表。我將列表存儲在一個數組中,並將它與註冊表中卸載鍵中的應用程序的DisplayName進行比較。Windows註冊表中應用程序DisplayNames的部分匹配?

[email protected]('Paint.net', 'Blender', 'SketchUp') 

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

此方法適用,但僅適用於完全匹配。 「Blender」和「Paint.net」在輸出中列出,但不包含SketchUp,因爲完整的DisplayName是「SketchUp 2017」。不管DisplayName中的其他文本(版本號)如何獲得此匹配關鍵字?我試過$ _ DisplayName屬性的通配符,但它們要麼拋出錯誤,要麼根本不返回任何東西。每次Audacity的版本點擊幾個缺口時,我寧願不必更新腳本。

這可能很簡單,就像擴展屬性或其他東西一樣,但這是我無法理解的。感謝您的幫助。

+0

一個常見的PowerShell問題,但我找不到一個好的答案鏈接到。你可以比較(a)和(m) - 檢查一個事物與另一個事物。你可以將(a,b,c,d)與(m)進行比較 - 如果(a,b,c,d)中的任何內容匹配(m),則觸發一個答案。但是你試圖一次性比較(a,b,c,d)和(m,n,o,p)並得到一個答案 - 你不能,輸出是什麼?你需要兩個循環。 – TessellatingHeckler

回答

3

你可以做的是從你的$Apps數組中創建一個正則表達式,並使用-match。您將需要跳過您的字符串以說明任何特殊字符,並將其與管道(在RegEx中爲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 

這應該與您的關鍵字匹配。

+0

這個伎倆!謝謝。 –

相關問題