powershell - 如何查询跳过 PS* 的注册表值

标签 powershell registry

像这样查询注册表值名称时:

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* /sreg 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 , PSDrivePSProvider (还有更多吗?)当它们不在注册表中时,但是当它们在注册表中时包含它们。

奖励:只列出名称(而不是值)。

最佳答案

您可以在注册表项对象上使用 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/

相关文章:

visual-studio - 使用 PowerShell 和 TFS.exe 更新和删除项目中的文件

powershell - 脚本帮助重命名-复制-移动

c# - 通过 C# 在 Windows 注册表中创建一个 REG_NONE 空值

c# - Windows编程: setting different icons for the different file types handled by your application

delphi - 如何在Delphi 7中的treeView中显示注册表

python - 自动运行脚本时出现 Powershell 错误

html - 无法在下拉列表中选择项目

delphi - 在注册表中保存设置的代码

visual-studio - 在 Visual Studio 安装项目中,如何根据复选框对话框更新注册表?

powershell - 使用 PowerShell 连接到 SFTP 并下载文件