Как получить значение раздела реестра и только значение с помощью powershell

может ли кто-нибудь помочь мне вытащить значение раздела реестра и поместить его в переменную в PowerShell? До сих пор я использовал Get-ItemProperty и reg query и хотя оба будут вытягивать значение, оба также добавляют дополнительный текст. Мне нужен только текст строки из раздела реестра и только текст строки из ключа. Я уверен, что могу создать функцию для удаления дополнительного текста, но если что-то изменится (например, имя ключа reg), это может повлиять на это.

8 ответов


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

мне никогда не нравилось, как это было реализовано провайдером:/

в основном, это делает каждое значение реестра a PSCustomObject объект PsPath, PsParentPath, PsChildname, PSDrive и PSProvider свойства, а затем свойство для его фактического значения. Поэтому, даже если вы попросили элемент по имени, чтобы получить его значение, вы должны использовать имя еще раз.


ни один из этих ответов не работает в ситуациях, когда имя значения содержит пробелы, точки или другие символы, зарезервированные в 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 Studio17\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 Studio17\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 Studio17\Enterprise\
PS> 

это работает в PowerShell 2.0 - 5.0 (хотя вы, вероятно, должны использовать Get-ItemPropertyValue в v5).


  • полезный ответ Энди Арисменди объясняет раздражение от необходимости повторить имя значения, чтобы получить данные значения эффективно.
  • полезный ответ м Джереми Картера больше удобно, но может быть производительность pitfall для ключей с большим количеством значений, так как объект с большим количеством свойств должен быть сооруженный.

Примечание: все решения ниже обход проблема, описанная в Йена Кемпа's ответ-необходимость использовать явное цитирование для определенных имен значений при использовании в качестве свойства имена; например, .'15.0' - потому что имена значений передаются как параметры и доступ к собственности происходит через переменная, например, .$ValueName

Гарри Martyrossian упоминает в комментарии свой ответ что


Я не уверен, что это было изменено, или если это имеет какое-то отношение к какой версии PS вы используете, но, используя пример Энди, я могу удалить параметр-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

Ну, вам нужно быть конкретным здесь. Насколько я знаю, ключ в реестре - это "папка" свойств. Так вы имели в виду получить стоимость недвижимости? Если да, попробуйте что-то вроде этого:

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

Сначала мы получаем объект, содержащий свойство нужно с Get-ItemProperty и затем мы получаем значение для свойства, которое нам нужно от этого объекта. Это вернет значение свойства в виде строки. Пример выше дает вам версию PS для "legacy" / compatibility-mdoe powershell (1.0 или 2.0).


следующий код перечислит все значения для определенного раздела реестра, отсортирует их и вернет имя значения : пары значений, разделенные двоеточием (:):

$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 - ... ехе" ПИД %д APPDOM %д EXTEXT "%с" EVTHDL %д

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


дали ключ \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)

если вы создаете объект, вы получаете более читаемый вывод, а также получаете объект со свойствами, к которым вы можете получить доступ:

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