2016-04-22 8 views
1

レジストリを読み込むときに比較演算子を使用しようとすると、(デフォルト)キーが正しく比較されないようです。デフォルトのキーは文字列ですが、私は、文字列と比較するとき、それが一致しません:Powershellはレジストリを文字列として認識しません(デフォルト)

まず、作成した例レジストリ:

  • HKCU:\支社\ BRANCH2
  • HKCU:\支社\ BRANCH2 ! (デフォルト)= defaultValue(REG_SZ)
  • hkcu:\ branch1 \ branch2! testVal1 =でtestValue(REG_SZ)

私たちは、その後、次のコマンドを実行した場合:

(gp HKCU:\branch1\branch2).PSObject.Properties | ? {$_.Name -notlike 'PS*'} | select Name, TypeNameOfValue, Value | ft -a 

の検索結果を:

名前TypeNameOfValue値

---- ---- ----------- -----

(既定値)System.String defaultValue

testVal1可能System.StringでtestValue

あなたが見ることができるように、それは明らかに文字列としてデフォルト値を示しています。だから、なぜ次の比較はうまくいかないのですか?その結果得られる

Get-ItemProperty "HKCU:\branch1\branch2" | ForEach-Object { 
    $CurrentKey = $_ 
    write-host "Looking at key $CurrentKey" 
    foreach ($PropertyName in ($CurrentKey | Get-Item).GetValueNames()) { 
    if ($CurrentKey.$PropertyName -is [string]) { 
     write-host $PropertyName with value of $CurrentKey.$PropertyName STRING! 
    } 
    else{    
     write-host $PropertyName with value of $CurrentKey.$PropertyName NOT STRING!        
    } 
} 

}

:{(デフォルト)=はdefaultValue @キーをみる

と、 testVal1 = testValue}

値はNOT STRINGです!

testVal1の値がtestValueのSTRING!

(デフォルト)値の出力は空白(名前と値の両方)で、文字列として検出されません。どうしてこれなの?なぜデフォルト値をSTRINGと比較できないのですか?

答えて

0

私はteststring値でテストキーを作成しました。以下の作品ながら

$test = (gp HKCU:\test\).PSObject.Properties 

if (($test.Item("teststring").TypeNameOfValue) -eq "System.String") {"yes"} else {"no"} 
+0

:私は、値の型名を比較した。この方法を、 '(($ test.Item( "(既定)")TypeNameOfValue)-eq "可能System.String"。)' I」があれば変数として "デフォルト"の名前を取得するのに問題があります。投稿されたコードでレジストリをループしているので、名前のデフォルト値NAMEが変数の "(デフォルト)"ではなく "空白"として返されています。 – MrBeatnik

+0

私の例でforeachループをチェックしただけで、(デフォルトの)名前とsystem.stringの値の型が返されました。 '$($行の$行){書き込みホスト$行。名前、$行。種類名OfValue}' –

+0

(編集)私はこれをやった - 追加: 'if($ PropertyName -eq" ")$ valName = "(デフォルト値)"} else {$ valName = $ PropertyName} 'をコードに追加し、' if(($ test.Item($ valName).TypeNameOfValue)-eq "System.String"しかし、あなたのコードは良く見えます - ループコードを更新できるかどうか確認します。Thanks – MrBeatnik

関連する問題