像这样查询注册表值名称时:
Get-ItemProperty HKCU:\Software\Microsoft\Osk
你会得到一大堆额外的值。
PSPath : Microsoft.PowerShell.Core\Registry::HKEY_CURRENT_USER\Software\Microsoft\Osk
PSParentPath : Microsoft.PowerShell.Core\Registry::HKEY_CURRENT_USER\Software\Microsoft
PSChildName : Osk
PSDrive : HKCU
PSProvider : Microsoft.PowerShell.Core\Registry
WindowLeft : 100
WindowTop : 100
WindowWidth : 828
WindowHeight : 236
ClickSound : 1
Mode : 1
HoverPeriod : 1000
ScanInterval : 1000
UseDevice : 1
UseMouse : 0
UseKB : 1
ScanKey : 32
UseTextPrediction : 1
InsertSpace : 1
ShowNumPad : 0
我想要的只是值名称(
WindowLeft
,...)我怎样才能做到这一点?
编辑:字符串匹配不会削减它。我确实希望包含合法的注册表值名称。
示例(可以用
reg query hklm /v PS* /s
或 reg query hkcu /v PS* /s
做类似的事情reg add "HKCU\Software\BeSharp.net\Test" /v "Foo" /t REG_SZ /d "Bar" /f
reg add "HKCU\Software\BeSharp.net\Test" /v "Bar" /t REG_SZ /d "Foo" /f
reg add "HKCU\Software\BeSharp.net\Test" /v "PSPath" /t REG_SZ /d "Foo" /f
reg add "HKCU\Software\BeSharp.net\Test" /v "PSParentPath" /t REG_SZ /d "Foo" /f
reg add "HKCU\Software\BeSharp.net\Test" /v "PSChildName" /t REG_SZ /d "Foo" /f
reg add "HKCU\Software\BeSharp.net\Test" /v "PSDrive" /t REG_SZ /d "Foo" /f
reg add "HKCU\Software\BeSharp.net\Test" /v "PSProvider" /t REG_SZ /d "Foo" /f
reg add "HKCU\Software\BeSharp.net\Test" /v "1" /t REG_SZ /d "PSPath" /f
reg add "HKCU\Software\BeSharp.net\Test" /v "2" /t REG_SZ /d "PSParentPath" /f
reg add "HKCU\Software\BeSharp.net\Test" /v "3" /t REG_SZ /d "PSChildName" /f
reg add "HKCU\Software\BeSharp.net\Test" /v "4" /t REG_SZ /d "PSDrive" /f
reg add "HKCU\Software\BeSharp.net\Test" /v "5" /t REG_SZ /d "PSProvider" /f
reg query "HKCU\Software\BeSharp.net\Test"
您可以使用以下命令删除上述演示数据:
reg delete "HKCU\Software\BeSharp.net\Test"
reg query "HKCU\Software\BeSharp.net\Test"
返回这个:HKEY_CURRENT_USER\Software\BeSharp.net\Test
Foo REG_SZ Bar
Bar REG_SZ Foo
PSPath REG_SZ Foo
PSParentPath REG_SZ Foo
PSChildName REG_SZ Foo
PSDrive REG_SZ Foo
PSProvider REG_SZ Foo
1 REG_SZ PSPath
2 REG_SZ PSParentPath
3 REG_SZ PSChildName
4 REG_SZ PSDrive
5 REG_SZ PSProvider
但是
PowerShell Get-ItemProperty "HKCU:\Software\BeSharp.net\Test"
返回这个,覆盖 PS*
注册表中的值:PSPath : Microsoft.PowerShell.Core\Registry::HKEY_CURRENT_USER\Software\BeSharp.net\Test
PSParentPath : Microsoft.PowerShell.Core\Registry::HKEY_CURRENT_USER\Software\BeSharp.net
PSChildName : Test
PSDrive : HKCU
PSProvider : Microsoft.PowerShell.Core\Registry
Foo : Bar
Bar : Foo
1 : PSPath
2 : PSParentPath
3 : PSChildName
4 : PSDrive
5 : PSProvider
并添加一个
Select
条款跳过所有 PS*
值,即使它们来自注册表:PowerShell Get-ItemProperty "HKCU:\Software\BeSharp.net\Test" ^| Select * -Exclude PS*
:Foo : Bar
Bar : Foo
1 : PSPath
2 : PSParentPath
3 : PSChildName
4 : PSDrive
5 : PSProvider
所以:跳过 PS* 值,如
PSPath
, PSParentPath
, PSChildName
, PSDrive
和 PSProvider
(还有更多吗?)当它们不在注册表中时,但是当它们在注册表中时包含它们。奖励:只列出名称(而不是值)。
最佳答案
您可以在注册表项对象上使用 GetValueNames() 方法:
$RegPath = "HKCU:\Software\Microsoft\Osk"
# Get just value names:
(Get-Item $RegPath).GetValueNames() -replace "^$", "(default)"
# Get PSObject excluding PS properties (this won't work when value names collide
# with reserved PS properties, e.g., PSPath, PSParentPath, PSChildName):
Get-Item $RegPath | ForEach-Object {
$_ | Get-ItemProperty | select ($_.GetValueNames() -replace "^$", "(default)")
}
# Get PSObject excluding PS properties (this works when the value names collide)
Get-Item $RegPath | ForEach-Object {
$RegKey = $_
$PropertyHash = @{}
$_.GetValueNames() -replace "^$", "(default)" | ForEach-Object {
$PropertyHash.$_ = $RegKey.GetValue($_)
}
New-Object PSObject -Property $PropertyHash
}
关于powershell - 如何查询跳过 PS* 的注册表值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24891899/