2017-07-06 77 views
0

我知道我在HKEY_LOCAL_MACHINE/SOFTWARE/CLASSES下有一個具有特定值的註冊表項。但是,我不知道密鑰。 (這是我試圖查找的GUID。)以下代碼可用於獲取此值,但速度很慢,看起來不夠優雅。有沒有更好的方法來做到這一點?在PowerShell中查找具有特定名稱值的註冊表項

$key = Get-ChildItem -Path "HKLM:\SOFTWARE\Classes" -Recurse | Get-ItemProperty -Name "FooBar" -ErrorAction @{} 
$codeGuid = $key.PsChildName 

回答

3

該遞歸是什麼殺死你。爲了減輕遞歸搜索類的負擔,可以手動指定Depth。如果您知道您的密鑰進入註冊表層次結構有多少步驟,則可以顯着降低速度。例如:

$Timer = New-Object System.Diagnostics.Stopwatch 

######NORMAL####### 
#Completes in 70.2157527 Seconds on my system 
$Timer.Start() 
    Get-ChildItem -Path "HKLM:\Software\Classes" -Recurse | Get-ItemProperty -Name "AlwaysShowExt" -ErrorAction SilentlyContinue | Out-Null 
$Timer.Stop() 
$Timer.Elapsed 
$Timer.Reset() 

######DEPTH 1###### 
#Completes in 12.7461096 Seconds on my system 
$Timer.Start() 
    Get-ChildItem -Path "HKLM:\Software\Classes" -Recurse -Depth 1 | Get-ItemProperty -Name "AlwaysShowExt" -ErrorAction SilentlyContinue | Out-Null 
$Timer.Stop() 
$Timer.Elapsed 
$Timer.Reset() 

######DEPTH 2###### 
#Completes in 33.9162044 Seconds on my system 
$Timer.Start() 
    Get-ChildItem -Path "HKLM:\Software\Classes" -Recurse -Depth 2 | Get-ItemProperty -Name "AlwaysShowExt" -ErrorAction SilentlyContinue | Out-Null 
$Timer.Stop() 
$Timer.Elapsed 
$Timer.Reset() 

您的最佳結果將與深度爲1,但深度爲2或3仍然會比沒有指定更快。

+0

我在2的深度;所以這比以前更好。但是,有沒有辦法在找到第一個時停止搜索?這可能會改善事情甚至更好。 – afeygin

+0

@afeygin可能有辦法做到這一點,但我不知道它。如果我找到方法,我會讓你。此外,深度參數僅適用於PowerShell v5之後。如果您需要替代方案,您可以執行以下操作:Get-ChildItem HKLM:\ Software \ Classes \\ * \\ * \\ * –

+0

我發現可以通過查看「HKLM:\ Software \ Classes \ Installer \ Features「而不是」HKLM:\ Software \ Classes「。 – afeygin

相關問題