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進行比較?
雖然以下工作:'如果(($ test.Item( 「(默認)」)TypeNameOfValue)當量 「System.String」。)'我」無法獲得「默認」名稱作爲變量。由於我使用發佈的代碼遍歷註冊表,名稱默認值NAME在變量中被返回爲「空白」而不是「(默認)」。 – MrBeatnik
剛剛在我的示例中檢查了foreach循環,它返回了(默認)名稱和system.string值類型。 'foreach($ test in $ test){Write-Host $ row.Name,$ row.TypeNameOfValue}' –
(編輯)我這樣做了 - 添加了:if($ PropertyName -eq「」){$ valName = 「(默認)」} else {$ valName = $ PropertyName}',然後運行if(($ test.Item($ valName).TypeNameOfValue)-eq「System.String」'這對我有效但是,你的代碼看起來更好 - 我會看看我是否可以更新循環代碼。謝謝 – MrBeatnik