Подтвердить что ты не робот

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

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

4b9b3361

Ответ 1

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

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

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

Ответ 2

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

Обновление: Гарри Мартироссиан упоминает в своем собственном ответе, что
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'

Используя блок script, имя значения может быть передано один раз в качестве параметра, а переменная параметра ($args) может быть просто использована дважды внутри блока.

В качестве альтернативы простая вспомогательная функция может облегчить боль:

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

Ответ 3

НЕТ этих ответов работают в ситуациях, когда имя значения содержит пробелы, точки или другие символы, зарезервированные в 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 (хотя вы, вероятно, должны использовать Get-ItemPropertyValue в версии 5).

Ответ 4

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

Ответ 5

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

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

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

Ответ 6

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

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

Ответ 7

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

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