2013-07-24 35 views
3

我試圖感受一下在PowerShell中使用的成語。如何在PowerShell中按名稱和值過濾名稱/值對下的註冊表項?

鑑於此腳本:

$path = 'hkcu:\Software\Microsoft\Windows\CurrentVersion\Extensions' 
$key = Get-Item $path 
$key 

我得到這個問題的底部輸出。

我想獲得輸出的屬性(名稱/值對下的$key),我可以在名稱和價值過濾。

例如,過濾器列出所有具有擴展:

  • 名狀xls*
  • 或價值一樣*\MSACCESS.EXE

或排除過濾器:排除像doc*

所有名稱

冷杉的第一個過濾器,我想要這樣的結果:

Name       Value                                      
----       --------                                      
xlsx       C:\PROGRA~2\MICROS~1\Office15\EXCEL.EXE                             
xls       C:\PROGRA~2\MICROS~1\Office15\EXCEL.EXE                             
mdb       C:\PROGRA~2\MICROS~1\Office15\MSACCESS.EXE                            
mda       C:\PROGRA~2\MICROS~1\Office15\MSACCESS.EXE                            

這是腳本的原始輸出:

Hive: HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion 
Name       Property                                      
----       --------                                      
Extensions      rtf : C:\PROGRA~2\MICROS~1\Office15\WINWORD.EXE ^.rtf                           
           dot : C:\PROGRA~2\MICROS~1\Office15\WINWORD.EXE ^.dot                           
           dotm : C:\PROGRA~2\MICROS~1\Office15\WINWORD.EXE ^.dotm                           
           dotx : C:\PROGRA~2\MICROS~1\Office15\WINWORD.EXE ^.dotx                           
           docm : C:\PROGRA~2\MICROS~1\Office15\WINWORD.EXE ^.docm                           
           docx : C:\PROGRA~2\MICROS~1\Office15\WINWORD.EXE ^.docx                           
           doc : C:\PROGRA~2\MICROS~1\Office15\WINWORD.EXE ^.doc                           
           xlsx : C:\PROGRA~2\MICROS~1\Office15\EXCEL.EXE                             
           xls : C:\PROGRA~2\MICROS~1\Office15\EXCEL.EXE                             
           mdb : C:\PROGRA~2\MICROS~1\Office15\MSACCESS.EXE                            
           mda : C:\PROGRA~2\MICROS~1\Office15\MSACCESS.EXE                            

編輯

我解決了這個問題的一部分:越來越名稱/值對的列表。它採用PSCustomObject

$namevalues = $key.GetValueNames() | ForEach-Object { [pscustomobject]@{ Name=$_; Value=$key.GetValue($_) } } 
$namevalues 

(我應該如何換行代碼?)

與過濾任何幫助,將不勝感激

回答

1

還有一種更聰明的方法來枚舉註冊表值(發現它here)。而且它更像powershell-way IMO。

我已經把它變成一個班輪:

(Get-ItemProperty $path).psobject.properties | 
    where {$_.name -like "xls*" -or $_.value -like "*\MSACCESS.EXE"} | 
     select name,value 
+0

謝謝。我從來沒有聽說過'PSObject'屬性,因爲它不會與'Get-Member'一起顯示,但顯然它是隱藏的,因爲它存在於任何PowerShell對象上。今天學到了一件偉大的新事物。 +1並被接受。 –

5

的兩個部分答案。

我們先從$key從註冊表:

$path = 'hkcu:\Software\Microsoft\Windows\CurrentVersion\Extensions' 
$key = Get-Item $path 
$key 
$key | Get-Member 

由於$keyMicrosoft.Win32.RegistryKey,你不能出來直接將名稱值對。

第一步是創建一個PSCustomObjectsName/Value對的列表。 Name來自通過ForEach-Object傳送的GetValueNames。對於每一個這些名稱,我們得到Value通過GetValue

$namevalues = $key.GetValueNames() | 
    ForEach-Object { 
    [PSCustomObject] @{ 
     Name = $_; 
     Value = $key.GetValue($_) 
    } 
    } 
$namevalues | Format-Table 

用於第一步的替代方法是使用利用-ExpandPropertySelect-Object通過Scott Saad解釋:

$namevalues = $key | Select-Object -ExpandProperty Property | 
    ForEach-Object { 
    [PSCustomObject] @{ 
     Name = $_; 
     Value = $key.GetValue($_) 
    } 
    } 
$namevalues | Format-Table 

的第二個步驟是通過NameValue過濾$namevalues

Where-Object有一些很酷的Comparison運算符accept regular expressionsmatchnotMatch

爲了使代碼更易讀,可以wrap lines(感謝Joey!)既可以使用反引號(')或利用(|)在PowerShell的語法,它的管道後不接受換行符,喜歡的地方或開括號({):

$matches = $namevalues | 
    Where-Object { 
    $_.Name -match '^xls' ` 
    -or $_.Value -match 'msaccess.exe$' 
    } 
$matches | Format-Table 

結果是通緝:

Name Value                       
---- -----                       
xlsx C:\PROGRA~2\MICROS~1\Office15\EXCEL.EXE              
xls  C:\PROGRA~2\MICROS~1\Office15\EXCEL.EXE              
mdb  C:\PROGRA~2\MICROS~1\Office15\MSACCESS.EXE              
mda  C:\PROGRA~2\MICROS~1\Office15\MSACCESS.EXE 
+1

很好的信息! +1 –

相關問題