2011-12-26 4 views
2

私はPowershellにCOM dllが登録されている場所からのパスを返す関数を持っています。関数内で正しいパスが返されますが、この関数が呼び出されたときに、いくつかのいずれかが、この奇妙な振る舞いを説明でき、出力Powershellを使用してHKCRから値を返す

function com_registeredpath() 
{ 
    param([string]$guid) 

    New-PSDrive -Name HKCR -PSProvider Registry -Root HKEY_CLASSES_ROOT 

    $key = Get-Item "HKCR:\CLSID\$guid\InprocServer32" 
    $values = Get-ItemProperty $key.PSPath 

    [string] $defaultValue = [string] $values."(default)" 
    write-host ">>>: $defaultValue" # returns a value like: c:\somefolder\somefile.dll 

    remove-psdrive -name HKCR 
    return $defaultValue 
} 

write-host "~~~" (com_registeredpath "{00F97463-DF44-11D1-BED5-00600831F894}") # returns a value like: HKCR c:\somefolder\somefile.dll 

の前に付け、余分な文字列「HKCR」はありますか?私は両方の戻り値が同じであると期待します。

答えて

2

ちょっときれいにしましたが、このバージョンでは正しい文字列が得られました。

function com_registeredpath() 
{ 
    param([string]$guid) 
    New-PSDrive -Name HKCR -PSProvider Registry -Root HKEY_CLASSES_ROOT | Out-Null 
    $key = Get-Item "HKCR:\CLSID\$guid\InprocServer32" 
    $values = Get-ItemProperty $key.PSPath 

    return $values.'(default)' 
} 

com_registeredpath "{0000002F-0000-0000-C000-000000000046}" 
+0

おかげで、プロバイダパスを使用し、PSDriveコマンドをクレートせずに値を得ることができます! – arung

4

私はregハイブの前にパスがありません。 まず、新しいpsdriveの結果を抑止する必要があります。関数がdllパス以外のものを返すことは望ましくありません(これをnullに割り当てました)。 最後には、あなただけのHKCR

ため、これも動作します
function Get-ComRegisteredPath 
{ 
    param([string]$Guid) 

    try 
    { 
     $reg = Get-ItemProperty "Registry::HKEY_CLASSES_ROOT\CLSID\$Guid\InprocServer32" -ErrorAction Stop 
     $reg.'(default)' 
    } 
    catch 
    { 
     Write-Error $_ 
    } 
} 

PS> Get-ComRegisteredPath -Guid '{00F97463-DF44-11D1-BED5-00600831F894}' 
+0

ありがとうございます! – arung

関連する問題