2017-07-06 30 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

リクルートはあなたを殺すものです。クラスを再帰的に検索する負担を軽減するため、手動で深さを指定することができます。キーがレジストリ階層にいくつあるかを知っていれば、大幅に速度を下げることができます。たとえば:

$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おそらくそれを行う方法はありますが、私はそれを認識していません。私は方法を見つけるならば、私をお手伝いします。また、DepthパラメータはPowershell v5の後でのみ動作します。もしあなたが何か別のものが必要な場合は、次のようなことができます:Get-ChildItem HKLM:\ Software \ Classes \\ * \\ * \\ * –

+0

"HKLM:\ Software \ HKLM:\ Software \ Classes "の代わりに" Classes \ Installer \ Features "を選択します。 – afeygin

関連する問題