การทำงานกับรายการรีจิสตรี
ตัวอย่างนี้ใช้กับแพลตฟอร์ม Windows เท่านั้น
เนื่องจากรายการรีจิสตรีเป็นคุณสมบัติของคีย์ และด้วยเหตุนี้จึงไม่สามารถเรียกดูได้โดยตรง เราจึงจำเป็นต้องใช้แนวทางที่แตกต่างออกไปเล็กน้อยเมื่อทำงานกับรายการเหล่านั้น
แสดงรายการรายการรีจิสทรี
มีหลายวิธีในการตรวจสอบรายการรีจิสทรี วิธีที่ง่ายที่สุดคือการรับชื่อคุณสมบัติที่เกี่ยวข้องกับคีย์ ตัวอย่างเช่น หากต้องการดูชื่อของรายการในคีย์รีจิสทรี HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion ให้ใช้ Get-Item คีย์รีจิสทรีมีคุณสมบัติที่มีชื่อทั่วไปว่า "คุณสมบัติ" ซึ่งเป็นรายการรายการรีจิสทรีในคีย์ คำสั่งต่อไปนี้จะเลือกคุณสมบัติคุณสมบัติและขยายรายการเพื่อให้แสดงในรายการ:
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, 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
...
การขยายพาธทำงานเหมือนกับที่ทำงานภายในระบบไฟล์ ดังนั้นจากตำแหน่งนี้ คุณจะได้รับรายการ ItemProperty สำหรับ HKLM:\SOFTWARE\Microsoft\Windows\Help โดยใช้ รับ-ItemProperty -Path ..\ช่วยเหลือ
รับรายการรีจิสทรีรายการเดียว
หากคุณต้องการดึงข้อมูลรายการเฉพาะในคีย์รีจิสทรี คุณสามารถใช้วิธีใดวิธีหนึ่งที่เป็นไปได้ ตัวอย่างนี้ค้นหาค่าของ DevicePath ใน HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion
การใช้ 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
คุณยังสามารถใช้อ็อบเจ็กต์ COM WshShell เพื่อค้นหารายการรีจิสทรีบางรายการได้ แม้ว่าวิธีนี้จะใช้ไม่ได้กับข้อมูลไบนารีขนาดใหญ่หรือกับชื่อรายการรีจิสทรีที่มีอักขระ เช่น แบ็กสแลช (\) ผนวกชื่อคุณสมบัติเข้ากับเส้นทางรายการด้วยตัวคั่น \:
(New-Object -ComObject WScript.Shell).RegRead("HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\DevicePath")
%SystemRoot%\inf
การตั้งค่ารายการรีจิสทรีรายการเดียว
หากคุณต้องการเปลี่ยนรายการเฉพาะในคีย์รีจิสทรี คุณสามารถใช้วิธีใดวิธีหนึ่งที่เป็นไปได้ ตัวอย่างนี้แก้ไขรายการ เส้นทาง ภายใต้ HKEY_CURRENT_USER\Environment รายการ เส้นทาง ระบุตำแหน่งที่จะค้นหาไฟล์ปฏิบัติการ
- รับค่าปัจจุบันของรายการ เส้นทาง โดยใช้
Get-ItemProperty - เพิ่มค่าใหม่ โดยคั่นด้วย
; - ใช้
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 /? ที่พร้อมท์คำสั่ง
ตัวอย่างต่อไปนี้เปลี่ยนรายการ เส้นทาง โดยลบเส้นทางที่เพิ่มในตัวอย่างด้านบน Get-ItemProperty ยังคงใช้เพื่อดึงค่าปัจจุบันเพื่อหลีกเลี่ยงการแยกวิเคราะห์สตริงที่ส่งคืนจาก แบบสอบถาม reg เมธอด 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]ไปยังพารามิเตอร์ ValueExpandString- ใช้สำหรับค่า REG_EXPAND_SZ ส่งผ่านออบเจ็กต์[System.String]ไปยังพารามิเตอร์ Value สตริงควรมีการอ้างอิงตัวแปรสภาพแวดล้อมที่ยังไม่ได้ขยายซึ่งจะถูกขยายเมื่อดึงค่าไบนารี- ใช้สำหรับค่า REG_BINARY ส่งผ่านออบเจ็กต์[System.Byte[]]ไปยังพารามิเตอร์ ValueDWord- ใช้สำหรับค่า REG_DWORD ส่งผ่านวัตถุ[System.Int32]ไปยังพารามิเตอร์ ValueMultiString- ใช้สำหรับค่า REG_MULTI_SZ ส่งผ่านออบเจ็กต์[System.String[]]ไปยังพารามิเตอร์ ValueQWord- ใช้สำหรับค่า REG_QWORD ส่งผ่านวัตถุ[System.Int64]ไปยังพารามิเตอร์ Value
คุณสามารถเพิ่มรายการรีจิสทรีไปยังหลายตำแหน่งได้โดยการระบุอาร์เรย์ของค่าสำหรับพารามิเตอร์ เส้นทาง:
$newItemPropertySplat = @{
Name = 'PowerShellPath'
PropertyType = 'String'
Value = $PSHome
Path = 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion',
'HKCU:\SOFTWARE\Microsoft\Windows\CurrentVersion'
}
New-ItemProperty @newItemPropertySplat
คุณยังสามารถเขียนทับค่ารายการรีจิสทรีที่มีอยู่แล้วได้ด้วยการเพิ่มพารามิเตอร์ Force ลงในคำสั่ง New-ItemProperty ใดๆ
ตัวอย่างต่อไปนี้แสดงวิธีการสร้างรายการรีจิสทรีใหม่ประเภทต่างๆ ค่ารีจิสทรีจะถูกสร้างขึ้นในคีย์ใหม่ชื่อ MySoftwareKey ภายใต้ HKEY_CURRENT_USER\Software ตัวแปร $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