2016-04-22 103 views
1

當我嘗試在讀取註冊表時使用比較運算符時,(默認)鍵似乎沒有正確比較。默認鍵是字符串,但是當我比較字符串,它不匹配:當比較運算符在讀取註冊表時,Powershell不能識別(默認)註冊表作爲字符串

首先,例如註冊表中創建:

  • HKCU:\ BRANCH1 \ BRANCH2
  • HKCU:\ BRANCH1 \ BRANCH2 ! (默認)= defaultValue(REG_SZ)
  • hkcu:\ branch1 \ branch2! testVal1 =測試值(REG_SZ)

如果我們再運行以下命令:

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

結果:

名稱TypeNameOfValue價值

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

(默認)System.String defaultValue

testVal1 System.String測試值

正如你所看到的,它清楚地列出了默認值作爲一個字符串。那麼,爲什麼下面的比較不起作用?

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!        
    } 
} 

}

哪個給出結果:

在鍵@ {(默認值)=默認值尋找; 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)當量 「System.String」。)'我」無法獲得「默認」名稱作爲變量。由於我使用發佈的代碼遍歷註冊表,名稱默認值NAME在變量中被返回爲「空白」而不是「(默認)」。 – MrBeatnik

+0

剛剛在我的示例中檢查了foreach循環,它返回了(默認)名稱和system.string值類型。 'foreach($ test in $ test){Write-Host $ row.Name,$ row.TypeNameOfValue}' –

+0

(編輯)我這樣做了 - 添加了:if($ PropertyName -eq「」){$ valName = 「(默認)」} else {$ valName = $ PropertyName}',然後運行if(($ test.Item($ valName).TypeNameOfValue)-eq「System.String」'這對我有效但是,你的代碼看起來更好 - 我會看看我是否可以更新循環代碼。謝謝 – MrBeatnik