任何人都可以帮我提取注册表项的值并将其放入PowerShell中的变量中吗?到目前为止,我已经使用了Get-ItemProperty
和reg query
,虽然两者都会提取值,但两者都会添加额外的文本。我只需要注册表项中的字符串文本,只需要键中的字符串文本。我确信我可以创建一个函数去除额外的文本但是如果有什么变化(例如reg键名称),它可能会影响这个。
答案 0 :(得分:86)
$key = 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion'
(Get-ItemProperty -Path $key -Name ProgramFilesDir).ProgramFilesDir
我从来都不喜欢这个提供程序是如何实现的:/
基本上,它使每个注册表值都成为PSCustomObject
,PsPath
,PsParentPath
,PsChildname
和PSDrive
属性的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
:
我抓住了" 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\