繁体   English   中英

如何使用powershell获取注册表项的值并且仅获取该值

[英]How do I get the value of a registry key and ONLY the value using powershell

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

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

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

基本上,它使每个注册表值成为具有PsPathPsParentPathPsChildnamePSDrivePSProvider属性的PSCustomObject对象,然后是其实际值的属性。 因此,即使您按名称要求该项目,为了获得它的价值,您也必须再次使用该名称。

这些答案都不适用于值名称包含空格、点或 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 )。

Harry Martyrossian 在评论他自己的回答时提到
Powershell v5中引入了Get-ItemPropertyValue cmdlet,解决了这个问题:

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 ) 可以在块内简单地使用两次。

或者,一个简单的辅助函数可以减轻痛苦:

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

注意:上述所有解决方案都绕过Ian Kemp 的回答中描述的问题——当用作属性名称时,需要对某些值名称使用显式引用; 例如, .'15.0' - 因为值名称作为参数传递,并且属性访问通过变量发生; 例如, .$ValueName


至于其他答案:

我不确定这是否已更改,或者是否与您使用的 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

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

在此处输入图片说明

在我不确定使用点符号的属性名称是什么的情况下,我会使用以下情况获取“MSSQLSERVER”:

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

那么你需要在这里具体。 据我所知,注册表中的键是属性的“文件夹”。 所以你的意思是得到一个财产的价值? 如果是这样,请尝试以下操作:

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

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

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

$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

安装根目录:C:\\Windows\\Microsoft.NET\\Framework\\

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

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

只是在 Google 出于相关原因将我带到这里时才添加了这一点,我最终想出了上面的单线来疏通注册表。

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

$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\

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM