如何使用PowerShell获取注册表项的值和值

时间:2013-03-19 22:33:36

标签: variables powershell registrykey

任何人都可以帮我提取注册表项的值并将其放入PowerShell中的变量中吗?到目前为止,我已经使用了Get-ItemPropertyreg query,虽然两者都会提取值,但两者都会添加额外的文本。我只需要注册表项中的字符串文本,只需要键中的字符串文本。我确信我可以创建一个函数去除额外的文本但是如果有什么变化(例如reg键名称),它可能会影响这个。

9 个答案:

答案 0 :(得分:86)

$key = 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion'
(Get-ItemProperty -Path $key -Name ProgramFilesDir).ProgramFilesDir

我从来都不喜欢这个提供程序是如何实现的:/

基本上,它使每个注册表值都成为PSCustomObjectPsPathPsParentPathPsChildnamePSDrive属性的PSProvider对象,然后物业的实际价值。因此,即使您按名称要求该项目,要获得其价值,您还必须再次使用该名称。

答案 1 :(得分:20)

这些答案中的任何一个都适用于值名称包含空格,圆点或PowerShell中保留的其他字符的情况。在这种情况下,您必须按照http://blog.danskingdom.com/accessing-powershell-variables-with-periods-in-their-name/将名称用双引号括起来 - 例如:

PS> Get-ItemProperty Registry::HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\VisualStudio\SxS\VS7

14.0         : C:\Program Files (x86)\Microsoft Visual Studio 14.0\
12.0         : C:\Program Files (x86)\Microsoft Visual Studio 12.0\
11.0         : C:\Program Files (x86)\Microsoft Visual Studio 11.0\
15.0         : C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\
PSPath       : Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\VisualStudio\SxS\V
               S7
PSParentPath : Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\VisualStudio\SxS
PSChildName  : VS7
PSProvider   : Microsoft.PowerShell.Core\Registry

如果您想访问14.0,12.0,11.0,15.0中的任何一个值,接受的答案中的解决方案将无效 - 您将无法获得输出:

PS> (Get-ItemProperty Registry::HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\VisualStudio\SxS\VS7 -Name 15.0).15.0
PS>

工作是什么引用了值名称,为了安全起见,您可能应该这样做:

PS> (Get-ItemProperty "Registry::HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\VisualStudio\SxS\VS7" -Name "15.0")."15.0"
C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\
PS> 

因此,接受的答案应该如下修改:

PS> $key = "Registry::HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\VisualStudio\SxS\VS7"
PS> $value = "15.0"
PS> (Get-ItemProperty -Path $key -Name $value).$value
C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\
PS> 

这适用于PowerShell 2.0到5.0(尽管你应该在v5中使用Get-ItemPropertyValue)。

答案 2 :(得分:13)

注意:以下所有解决方案绕过 Ian Kemp's的答案中描述的问题 - 当用作属性名称;例如,.'15.0' - 因为值名称作为参数传递,属性访问通过变量进行;例如,.$ValueName

Harry Martyrossian在对his own answer的评论中提到了 Get-ItemPropertyValue cmdlet Powershell v5 中引入,解决了这个问题:

PS> Get-ItemPropertyValue 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion' 'ProgramFilesDir'
C:\Program Files

PowerShell v4的替代品 -

这里尝试保留效率,同时不需要重复值名称,但这仍然有点麻烦:

& { (Get-ItemProperty `
      -LiteralPath HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion `
      -Name $args `
    ).$args } 'ProgramFilesDir'

通过使用脚本块,值名称可以在中传递作为参数,然后参数变量($args)可以在块内简单地使用两次。 / p>

或者,一个简单的帮助函数可以缓解疼痛:

function Get-RegValue([String] $KeyPath, [String] $ValueName) {
  (Get-ItemProperty -LiteralPath $KeyPath -Name $ValueName).$ValueName
}

答案 3 :(得分:6)

我不确定这是否已更改,或者是否与您正在使用的PS版本有关,但使用Andy的示例,我可以删除-Name参数和我仍然得到reg项的值:

PS C:\> $key = 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion'
PS C:\> (Get-ItemProperty -Path $key).ProgramFilesDir
C:\Program Files


PS C:\> $psversiontable.psversion

Major  Minor  Build  Revision
-----  -----  -----  --------
2      0      -1     -1

答案 4 :(得分:2)

嗯,你需要具体到这里。据我所知,注册表中的键是属性的“文件夹”。所以你的意思是获得财产的价值?如果是这样,尝试这样的事情:

(Get-ItemProperty HKLM:\Software\Microsoft\PowerShell\1\PowerShellEngine -Name PowerShellVersion).PowerShellVersion

首先,我们得到一个包含Get-ItemProperty所需属性的对象,然后我们从该对象获取所需属性的值。这将以字符串形式返回属性的值。上面的示例为您提供了“legacy”/ compatibility-mdoe powershell(1.0或2.0)的PS版本。

答案 5 :(得分:1)

以下代码将枚举某个注册表项的所有值,将对它们进行排序并返回值冒号(:)分隔的值:值对:

$path = 'HKLM:\SOFTWARE\Wow6432Node\Microsoft\.NETFramework';

Get-Item -Path $path | Select-Object -ExpandProperty Property | Sort | % {
    $command = [String]::Format('(Get-ItemProperty -Path "{0}" -Name "{1}")."{1}"', $path, $_);
    $value = Invoke-Expression -Command $command;
    $_ + ' : ' + $value; };

像这样:

DbgJITDebugLaunchSetting:16

DbgManagedDebugger:“C:\ Windows \ system32 \ vsjitdebugger.exe”PID%d APPDOM%d EXTEXT“%s”EVTHDL%d

InstallRoot:C:\ Windows \ Microsoft.NET \ Framework \

答案 6 :(得分:1)

给定一个具有两个属性的键\SQL

enter image description here

我抓住了" MSSQLSERVER"一个有以下情况,我不确定使用点符号的属性名称是什么:

$regkey_property_name = 'MSSQLSERVER'
$regkey = get-item -Path 'HKLM:\Software\Microsoft\Microsoft SQL Server\Instance Names\SQL'
$regkey.GetValue($regkey_property_name)

答案 7 :(得分:1)

不确定此功能到达哪个版本,但可以使用类似的方法返回数组中多个子注册表项的所有属性:

$InstalledSoftware = Get-ChildItem "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall" | ForEach-Object {Get-ItemProperty "Registry::$_"}

仅在Google出于相关原因将我带到这里时才添加此内容,我最终想出了上述一类工具来疏通注册表。

答案 8 :(得分:0)

如果您创建了一个对象,您将获得更易读的输出,并获得一个具有您可以访问的属性的对象:

$path = 'HKLM:\SOFTWARE\Wow6432Node\Microsoft\.NETFramework'
$obj  = New-Object -TypeName psobject

Get-Item -Path $path | Select-Object -ExpandProperty Property | Sort | % {
$command = [String]::Format('(Get-ItemProperty -Path "{0}" -Name "{1}")."{1}"', $path, $_)
$value = Invoke-Expression -Command $command
$obj | Add-Member -MemberType NoteProperty -Name $_ -Value $value}

Write-Output $obj | fl

示例输出: InstallRoot:C:\ Windows \ Microsoft.NET \ Framework \

对象: $ obj.InstallRoot = C:\ Windows \ Microsoft.NET \ Framework \

事情的真相是这比现在更复杂。这是一个更好的例子,更简单:

$path = 'HKLM:\SOFTWARE\Wow6432Node\Microsoft\.NETFramework'
$objReg = Get-ItemProperty -Path $path | Select -Property *

$ objReg现在是一个自定义对象,其中每个注册表项都是属性名称。您可以通过以下方式查看格式化列表:

write-output $objReg

InstallRoot        : C:\Windows\Microsoft.NET\Framework\
DbgManagedDebugger : "C:\windows\system32\vsjitdebugger.exe"

您可以访问对象本身:

$objReg.InstallRoot
C:\Windows\Microsoft.NET\Framework\