我如何获得registry项的值,只有使用PowerShell的值

任何人都可以帮我拉一个registry项的值,并将其放置在PowerShell中的variables? 到目前为止,我已经使用Get-ItemPropertyreg query ,虽然两者都将拉值,两者还添加额外的文本。 我只需要registry项中的string文本,只需要键中的string文本。 我敢肯定,我可以创build一个function来剥离额外的文本,但如果更改(即registry项名称)可能会影响这一点。

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

我从来没有喜欢这样的提供者是如何实现的:/

基本上,它使每个registry值成为具有PsPathPsParentPathPsChildnamePSDrivePSProvider属性的PSCustomObject对象,然后是其实际值的属性。 所以,即使你要求名称的项目,为了得到它的价值,你必须再次使用该名称。

  • Andy Arismendi的有用答案解释了为了有效地获取价值数据而必须重复价值名称的烦恼。
  • M Jeremy Carter的有用答案更为方便 ,但是对于具有大量值的键来说,这可能是一个性能上的问题,因为必须构build具有大量属性的对象。

更新 :Harry Martyrossian在对自己的答案评论中提到
Get-ItemPropertyValue cmdlet是在Powershell v5中引入的,它解决了这个问题:

 > 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' 

通过使用脚本块,可以将值名称作为参数传入一次 ,然后可以在块内简单地使用两次参数variables( $args )。

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

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

这些答案中的任何一个都适用于值名称包含空格,点或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中的任何一个值,则接受的答案中的解决scheme将不起作用 – 您将不会得到任何输出:

 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(尽pipe你应该在v5中使用Get-ItemPropertyValue )。

我不知道这是否已经改变,或者如果它与你正在使用的PS版本有关,但使用Andy的例子,我可以删除-Name参数,我仍然可以获得注册项目的值:

 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 

那么你需要在这里具体。 据我所知,registry中的关键是属性的“文件夹”。 那么你的意思是得到一个物业的价值? 如果是这样,请尝试如下所示:

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

首先我们通过Get-ItemProperty得到一个包含我们需要的属性的对象,然后从该对象中获取我们需要的属性的值。 这将以string的forms返回属性的值。 上面的例子给出了“legacy”/ compatibility-mdoe powershell(1.0或2.0)的PS版本。

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

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

如果你创build一个对象,你将得到一个更可读的输出,并获得一个可以访问的属性的对象:

 $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现在是一个自定义对象,其中每个registry项是一个属性名称。 您可以通过以下方式查看格式化的列表:

 write-output $objReg InstallRoot : C:\Windows\Microsoft.NET\Framework\ DbgManagedDebugger : "C:\windows\system32\vsjitdebugger.exe" 

你可以访问对象本身:

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