我可以使用Get-Item檔案夾、檔案和注冊表項,并且我回傳的物件型別是有意義的;[System.IO.DirectoryInfo],[System.IO.FileInfo]或[Microsoft.Win32.RegistryKey].
但是對于注冊表屬性,使用Get-ItemProperty回傳的是[System.Management.Automation.PSCustomObject]. 這是因為沒有用于注冊表屬性的專用型別嗎?這似乎很奇怪。但是我的 Google-Fu 沒有出現任何問題。
我的用例是這樣的,我正在執行一系列復制和移動任務,所有四種專案型別都可能被復制或移動,我想實作一個選項來重命名現有目標,而不是覆寫或失敗。重命名選項的確切含義取決于物件型別。并且從可讀性的角度來看,PSCustom Object或者一個簡單else的 RegistryProperty 有點難看。因此,尋找一種方法將屬性恢復為具有更明顯名稱的型別,因此當我在 12 個月后再次查看代碼時,它是有道理的。
uj5u.com熱心網友回復:
Get-ItemProperty回傳概念上的注冊表值物件:具有名稱和 - 呃... - 值(命名值物件的資料)的注冊表項的屬性。
.NET 注冊表 API沒有表示此類值物件的型別 - 相反,它允許通過注冊表項型別.GetValue($valueName)(獲取特定值物件的資料[1])和.GetValueNames()方法(獲取所有值名稱的串列)進行訪問。
PowerShell 實作者顯然選擇不實作他們自己的 .NET 型別,而是選擇使用 PowerShell 的通用動態“property-bag”型別[pscustomobject][2]來對這些值物件進行建模。
如果您想避免回傳的[pscustomobject]實體Get-ItemProperty,您可以Get-Item改用,它回傳一個Microsoft.Win32.RegistryKey實體,即表示鍵的 .NET 型別的實體,您可以在其上呼叫上述方法。
順便說一句:如果您只是對給定值物件的資料感興趣,則可以使用 PSv5
Get-ItemPropertyValuecmdlet(例如,
Get-ItemPropertyValue HKCU:\Console -Name LineWrap直接回傳[int]目標值的資料)。
[1] 此外,正如js2010 的回答所示,該.GetValueKind()方法回傳一個enum值,該值標識給定值物件的特定于注冊表的資料型別。這些型別 暗示了用于表示它們的.NET型別,由 回傳.GetValue(),但在某些情況下沒有直接的等效項( ExpandString, MultiString, Unknown) 并且需要額外的作業才能正確解釋它們。
[2] 有可能 - 但在這種情況下沒有完成 - 將(一個或多個)自選型別名稱分配給[pscustomobject]實體,PowerShell 在Get-Member輸出中將其反映為型別名稱(只有第一個,如果有多個)并且它尊重 ETS 型別定義和格式資料定義。但是,此類偽型別不能作為型別文字訪問;例如:$obj = [pscustomobject] @{ PSTypeName = 'MyType'; prop = 'foo' }允許您使用 測驗此型別名稱$obj.pstypenames -contains 'MyType',但不能使用$obj -is [MyType]. 也就是說,您可以通過[PSTypeName()]屬性在它們的基礎上進行引數宣告。
uj5u.com熱心網友回復:
有一種方法可以獲取屬性的型別:
$key = get-item hkcu:\key1
$key.GetValueKind('value1')
DWord
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/358638.html
