ค้นหาเว็บไซต์

การทำงานกับรายการรีจิสตรี


ตัวอย่างนี้ใช้กับแพลตฟอร์ม 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 รายการ เส้นทาง ระบุตำแหน่งที่จะค้นหาไฟล์ปฏิบัติการ

  1. รับค่าปัจจุบันของรายการ เส้นทาง โดยใช้ Get-ItemProperty
  2. เพิ่มค่าใหม่ โดยคั่นด้วย ;
  3. ใช้ 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] ไปยังพารามิเตอร์ Value
  • ExpandString - ใช้สำหรับค่า REG_EXPAND_SZ ส่งผ่านออบเจ็กต์ [System.String] ไปยังพารามิเตอร์ Value สตริงควรมีการอ้างอิงตัวแปรสภาพแวดล้อมที่ยังไม่ได้ขยายซึ่งจะถูกขยายเมื่อดึงค่า
  • ไบนารี - ใช้สำหรับค่า REG_BINARY ส่งผ่านออบเจ็กต์ [System.Byte[]] ไปยังพารามิเตอร์ Value
  • DWord - ใช้สำหรับค่า REG_DWORD ส่งผ่านวัตถุ [System.Int32] ไปยังพารามิเตอร์ Value
  • MultiString - ใช้สำหรับค่า REG_MULTI_SZ ส่งผ่านออบเจ็กต์ [System.String[]] ไปยังพารามิเตอร์ Value
  • QWord - ใช้สำหรับค่า 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

บทความที่เกี่ยวข้อง