レジストリを読み込むときに比較演算子を使用しようとすると、(デフォルト)キーが正しく比較されないようです。デフォルトのキーは文字列ですが、私は、文字列と比較するとき、それが一致しません: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と比較できないのですか?
:私は、値の型名を比較した。この方法を、 '(($ test.Item( "(既定)")TypeNameOfValue)-eq "可能System.String"。)' I」があれば変数として "デフォルト"の名前を取得するのに問題があります。投稿されたコードでレジストリをループしているので、名前のデフォルト値NAMEが変数の "(デフォルト)"ではなく "空白"として返されています。 – MrBeatnik
私の例でforeachループをチェックしただけで、(デフォルトの)名前とsystem.stringの値の型が返されました。 '$($行の$行){書き込みホスト$行。名前、$行。種類名OfValue}' –
(編集)私はこれをやった - 追加: 'if($ PropertyName -eq" ")$ valName = "(デフォルト値)"} else {$ valName = $ PropertyName} 'をコードに追加し、' if(($ test.Item($ valName).TypeNameOfValue)-eq "System.String"しかし、あなたのコードは良く見えます - ループコードを更新できるかどうか確認します。Thanks – MrBeatnik