使用登錄專案
此範例僅適用於 Windows 平臺。
由於登錄專案是機碼的屬性,因此無法直接流覽,因此在使用它們時,我們需要採取稍微不同的方法。
列出登錄專案
檢查登錄專案的方式有很多種。 最簡單的方式是取得與索引鍵相關聯的屬性名稱。 例如,若要查看登錄機碼 HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion
中項目的名稱,請使用 Get-Item
。 登錄機碼具有屬性,其泛型名稱為 「Property」 ,這是機碼中的登錄專案清單。 下列命令會選取 Property 屬性並展開專案,使其顯示在清單中:
Get-Item -Path Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion |
Select-Object -ExpandProperty Property
DevicePath
MediaPathUnexpanded
ProgramFilesDir
CommonFilesDir
ProductId
若要以更容易閱讀的形式檢視登錄專案,請使用 Get-ItemProperty
:
Get-ItemProperty -Path Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion
ProgramFilesDir : C:\Program Files
CommonFilesDir : C:\Program Files\Common Files
ProgramFilesDir (x86) : C:\Program Files (x86)
CommonFilesDir (x86) : C:\Program Files (x86)\Common Files
CommonW6432Dir : C:\Program Files\Common Files
DevicePath : C:\WINDOWS\inf
MediaPathUnexpanded : C:\WINDOWS\Media
ProgramFilesPath : C:\Program Files
ProgramW6432Dir : C:\Program Files
SM_ConfigureProgramsName : Set Program Access and Defaults
SM_GamesName : Games
PSPath : Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\SOFTWA
RE\Microsoft\Windows\CurrentVersion
PSParentPath : Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\SOFTWA
RE\Microsoft\Windows
PSChildName : CurrentVersion
PSDrive : HKLM
PSProvider : Microsoft.PowerShell.Core\Registry
密鑰的 Windows PowerShell 相關屬性全都加上 “PS”,例如 PSPath、PSPare、PSParentPath、PSChildName 和 PSProvider。
您可以使用 *.*
表示法來參考目前的位置。 您可以先使用 Set-Location
變更為 CurrentVersion 登錄容器:
Set-Location -Path Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion
或者,您可以使用內 HKLM:
建的 PSDrive 搭配 Set-Location
:
Set-Location -Path HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion
接著 .
,您可以使用目前位置的表示法來列出屬性,而不指定完整路徑:
Get-ItemProperty -Path .
...
DevicePath : C:\WINDOWS\inf
MediaPathUnexpanded : C:\WINDOWS\Media
ProgramFilesDir : C:\Program Files
...
路徑擴充的運作方式與文件系統內相同,因此您可以從這個位置取得使用Get-ItemProperty -Path ..\Help
的 HKLM:\SOFTWARE\Microsoft\Windows\Help
ItemProperty 清單。
取得單一登錄專案
如果您想要擷取登錄機碼中的特定專案,您可以使用數種可能的方法之一。 此範例會在 中HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion
尋找 DevicePath 的值。
使用Get-ItemProperty
,使用Path參數來指定索引鍵的名稱,並使用Name參數來指定DevicePath項目的名稱。
Get-ItemProperty -Path HKLM:\Software\Microsoft\Windows\CurrentVersion -Name DevicePath
DevicePath : C:\WINDOWS\inf
PSPath : Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion
PSParentPath : Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\Software\Microsoft\Windows
PSChildName : CurrentVersion
PSDrive : HKLM
PSProvider : Microsoft.PowerShell.Core\Registry
此命令會傳回標準 Windows PowerShell 屬性以及 DevicePath 屬性。
注意
雖然 Get-ItemProperty
具有 Filter、 Include 和 Exclude 參數,但無法用來依屬性名稱進行篩選。 這些參數是指登錄機碼,這些登錄機碼是專案路徑,而不是登錄專案,也就是項目屬性。
另一個選項是使用 reg.exe
命令行工具。 如需 的說明 reg.exe
,請在命令提示字元輸入 reg.exe /?
。 若要尋找 DevicePath 專案,請使用 reg.exe
,如下列命令所示:
reg query HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion /v DevicePath
! REG.EXE VERSION 3.0
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion
DevicePath REG_EXPAND_SZ %SystemRoot%\inf
您也可以使用 WshShell COM 物件來尋找一些登錄專案,不過此方法不適用於大型二進位數據,或是包含反斜杠 (\
) 等字元的登錄項目名稱。 使用分隔符標記名稱附加至項目路徑 \
:
(New-Object -ComObject WScript.Shell).RegRead("HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\DevicePath")
%SystemRoot%\inf
設定單一登錄專案
如果您想要變更登錄機碼中的特定專案,您可以使用數種可能的方法之一。 此範例會修改 底下的HKEY_CURRENT_USER\Environment
Path專案。 Path 專案會指定要尋找可執行檔的位置。
- 使用
Get-ItemProperty
擷取Path專案的目前值。 - 加入新的值,並將它與 區隔開
;
。 - 搭配
Set-ItemProperty
指定的機碼、專案名稱和值來修改登錄專案。
$value = Get-ItemProperty -Path HKCU:\Environment -Name Path
$newpath = $value.Path += ";C:\src\bin\"
Set-ItemProperty -Path HKCU:\Environment -Name Path -Value $newpath
注意
雖然 Set-ItemProperty
具有 Filter、 Include 和 Exclude 參數,但無法用來依屬性名稱進行篩選。 這些參數是指登錄機碼,也就是項目路徑,而不是登錄專案,也就是項目屬性。
另一個選項是使用命令行工具Reg.exe。 如需reg.exe的說明,請在命令提示字元輸入 reg.exe /?
。
下列範例會移除上述範例中新增的路徑,以變更 Path 專案。
Get-ItemProperty
仍然用來擷取目前的值,以避免必須剖析從 reg query
傳回的字串。 SubString 和 LastIndexOf 方法可用來擷取新增至 Path 專案的最後一個路徑。
$value = Get-ItemProperty -Path HKCU:\Environment -Name Path
$newpath = $value.Path.SubString(0, $value.Path.LastIndexOf(';'))
reg add HKCU\Environment /v Path /d $newpath /f
The operation completed successfully.
建立新的登錄專案
若要將名為 「PowerShellPath」 的新專案新增至 CurrentVersion 機碼,請使用 New-ItemProperty
搭配索引鍵的路徑、專案名稱和專案的值。 在此範例中,我們將採用 Windows PowerShell 變數 $PSHome
的值,它會儲存 Windows PowerShell 安裝目錄的路徑。
您可以使用下列命令將新專案新增至機碼,而 命令也會傳回新項目的相關信息:
$newItemPropertySplat = @{
Path = 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion'
Name = 'PowerShellPath'
PropertyType = 'String'
Value = $PSHome
}
New-ItemProperty @newItemPropertySplat
PSPath : Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion
PSParentPath : Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows
PSChildName : CurrentVersion
PSDrive : HKLM
PSProvider : Microsoft.PowerShell.Core\Registry
PowerShellPath : C:\Program Files\Windows PowerShell\v1.0
PropertyType 必須是下表中Microsoft.Win32.RegistryValueKind 列舉成員的名稱:
String
- 用於REG_SZ值。 將[System.String]
對象傳遞至 Value 參數。ExpandString
- 用於REG_EXPAND_SZ值。 將[System.String]
對象傳遞至 Value 參數。 字串應該包含未展開的環境變數參考,這些環境變數會在擷取值時展開。Binary
- 用於REG_BINARY值。 將[System.Byte[]]
對象傳遞至 Value 參數。DWord
- 用於REG_DWORD值。 將[System.Int32]
對象傳遞至 Value 參數。MultiString
- 用於REG_MULTI_SZ值。 將[System.String[]]
對象傳遞至 Value 參數。QWord
- 用於REG_QWORD值。 將[System.Int64]
對象傳遞至 Value 參數。
您可以指定 Path 參數的值數組,將登入專案新增至多個位置:
$newItemPropertySplat = @{
Name = 'PowerShellPath'
PropertyType = 'String'
Value = $PSHome
Path = 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion',
'HKCU:\SOFTWARE\Microsoft\Windows\CurrentVersion'
}
New-ItemProperty @newItemPropertySplat
您也可以將 Force 參數新增至任何New-ItemProperty
命令,以覆寫既有的登錄專案值。
下列範例示範如何建立各種類型的新登錄專案。 登錄值會在 下HKEY_CURRENT_USER\Software
名為 MySoftwareKey 的新機碼中建立。 變數 $key
是用來儲存新的索引鍵物件。
$key = New-Item -Path HKCU:\Software -Name MySoftwareKey
$newItemPropertySplat = @{
Path = $key.PSPath
Name = 'DefaultFolders'
PropertyType = 'MultiString'
Value = 'Home', 'Temp', 'Publish'
}
New-ItemProperty @newItemPropertySplat
DefaultFolders : {Home, Temp, Publish}
PSPath : Microsoft.PowerShell.Core\Registry::HKEY_CURRENT_USER\Software\MySoftwareKey
PSParentPath : Microsoft.PowerShell.Core\Registry::HKEY_CURRENT_USER\Software
PSChildName : MySoftwareKey
PSProvider : Microsoft.PowerShell.Core\Registry
您可以在後續命令中使用 金鑰物件的 PSPath 屬性。
New-ItemProperty -Path $key.PSPath -Name MaxAllowed -PropertyType QWord -Value 1024
MaxAllowed : 1024
PSPath : Microsoft.PowerShell.Core\Registry::HKEY_CURRENT_USER\Software\MySoftwareKey
PSParentPath : Microsoft.PowerShell.Core\Registry::HKEY_CURRENT_USER\Software
PSChildName : MySoftwareKey
PSProvider : Microsoft.PowerShell.Core\Registry
您也可以使用管線 $key
將 New-ItemProperty
值新增至索引鍵。
$date = Get-Date -Format 'dd-MMM-yyyy'
$newItemPropertySplat = @{
Name = 'BinaryDate'
PropertyType = 'Binary'
Value = ([System.Text.Encoding]::UTF8.GetBytes($date))
}
$key | New-ItemProperty @newItemPropertySplat
BinaryDate : {51, 49, 45, 74…}
PSPath : Microsoft.PowerShell.Core\Registry::HKEY_CURRENT_USER\Software\MySoftwareKey
PSParentPath : Microsoft.PowerShell.Core\Registry::HKEY_CURRENT_USER\Software
PSChildName : MySoftwareKey
PSProvider : Microsoft.PowerShell.Core\Registry
顯示的內容 $key
會顯示新專案。
$key
Hive: HKEY_CURRENT_USER\Software
Name Property
---- --------
MySoftwareKey DefaultFolders : {Home, Temp, Publish}
MaxAllowed : 1024
BinaryDate : {51, 49, 45, 74…}
下列範例顯示每種登錄項目的實值類型:
$key.GetValueNames() | Select-Object @{n='ValueName';e={$_}},
@{n='ValueKind';e={$key.GetValueKind($_)}},
@{n='Type';e={$key.GetValue($_).GetType()}},
@{n='Value';e={$key.GetValue($_)}}
ValueName ValueKind Type Value
--------- --------- ---- -----
DefaultFolders MultiString System.String[] {Home, Temp, Publish}
MaxAllowed QWord System.Int64 1024
BinaryDate Binary System.Byte[] {51, 49, 45, 74…}
重新命名登錄專案
若要將 PowerShellPath 專案重新命名為 「PSHome」,請使用 Rename-ItemProperty
:
$renameItemPropertySplat = @{
Path = 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion'
Name = 'PowerShellPath'
NewName = 'PSHome'
}
Rename-ItemProperty @renameItemPropertySplat
若要顯示重新命名的值,請將 PassThru 參數新增至命令。
$renameItemPropertySplat = @{
Path = 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion'
Name = 'PowerShellPath'
NewName = 'PSHome'
PassThru = $true
}
Rename-ItemProperty @renameItemPropertySplat
刪除登錄專案
若要刪除 PSHome 和 PowerShellPath 登錄專案,請使用 Remove-ItemProperty
:
Remove-ItemProperty -Path HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion -Name PSHome
Remove-ItemProperty -Path HKCU:\SOFTWARE\Microsoft\Windows\CurrentVersion -Name PowerShellPath