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

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

62
задан 20 March 2013 в 03:28

8 ответов

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

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

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

95
ответ дан 31 October 2019 в 13:36

НИ ОДИН из этих ответов не работает на ситуации, где имя значения содержит пробелы, точки или другие символы, которые резервируются в 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 в v5).

22
ответ дан 31 October 2019 в 13:36
  • полезный ответ Andy Arismendi объясняет раздражение с необходимостью к [1 113] повторение имя значения для получения данных значения эффективно .
  • М полезный ответ Jeremy Carter является больше удобный , но может быть ловушка производительности для ключей с большим количеством значений, потому что объект с большим количеством свойств должен быть создан.
<час>

<глоток> Примечание: Все решения ниже обход проблема описала в Ian Kemp ответ - потребность использовать явное заключение в кавычки на определенные имена значения при использовании в качестве [1 118] имена свойства ; например, .'15.0' - потому что имена значения передаются как [1 119], параметры и доступ свойства происходят через переменная ; например, .$ValueName

Harry Martyrossian упоминает в комментарии его собственный ответ , что
Get-ItemPropertyValue cmdlet был представлен в [1 131] Powershell v5, который решает проблему:

PS> Get-ItemPropertyValue 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion' 'ProgramFilesDir'
C:\Program Files
<час>

Альтернативы для [1 132] PowerShell v4-:

Вот попытка сохранить эффективность при избавлении от необходимости повторение имени значения, которое, однако, является все еще немного громоздким:

& { (Get-ItemProperty `
      -LiteralPath HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion `
      -Name $args `
    ).$args } 'ProgramFilesDir'

При помощи блока сценария, имя значения может быть передано в [1 121] однажды в качестве параметра, и переменная параметра ($args) может затем просто использоваться дважды в блоке.

, С другой стороны, простая функция помощника может упростить боль:

function Get-RegValue([String] $KeyPath, [String] $ValueName) {
  (Get-ItemProperty -LiteralPath $KeyPath -Name $ValueName).$ValueName
}
14
ответ дан 31 October 2019 в 13:36

Я не уверен, было ли это изменено, или если это имеет некоторое отношение, какую версию PS Вы используете, но используете пример Andy, я могу удалить - параметр Имени, и я все еще получаю значение 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
6
ответ дан 31 October 2019 в 13:36

Учитывая ключ \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)
2
ответ дан 31 October 2019 в 13:36

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

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

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

[110]

Как это:

DbgJITDebugLaunchSetting: 16

DbgManagedDebugger: "C:\Windows\system32\vsjitdebugger.exe" PID %d APPDOM %d EXTEXT "%s" EVTHDL %d

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

); $value = Invoke-Expression -Command $command;

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

[110]

Как это:

DbgJITDebugLaunchSetting: 16

DbgManagedDebugger: "C:\Windows\system32\vsjitdebugger.exe" PID %d APPDOM %d EXTEXT "%s" EVTHDL %d

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

+ ' : ' + $value; };

Как это:

DbgJITDebugLaunchSetting: 16

DbgManagedDebugger: "C:\Windows\system32\vsjitdebugger.exe" PID %d APPDOM %d EXTEXT "%s" EVTHDL %d

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

1
ответ дан 31 October 2019 в 13:36

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

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

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

[110]

Демонстрационный вывод: InstallRoot: C:\Windows\Microsoft.NET\Framework\

И объект: $obj. InstallRoot = C:\Windows\Microsoft.NET\Framework\

The truth of the matter is this is way more complicated than it needs to be. Вот намного лучший пример, и намного более прост:

$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\
) $value = Invoke-Expression -Command $command $obj | Add-Member -MemberType NoteProperty -Name

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

[110]

Демонстрационный вывод: InstallRoot: C:\Windows\Microsoft.NET\Framework\

И объект: $obj. InstallRoot = C:\Windows\Microsoft.NET\Framework\

The truth of the matter is this is way more complicated than it needs to be. Вот намного лучший пример, и намного более прост:

$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\
-Value $value} Write-Output $obj | fl

Демонстрационный вывод: InstallRoot: C:\Windows\Microsoft.NET\Framework\

И объект: $obj. InstallRoot = C:\Windows\Microsoft.NET\Framework\

The truth of the matter is this is way more complicated than it needs to be. Вот намного лучший пример, и намного более прост:

$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\
0
ответ дан 31 October 2019 в 13:36

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

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

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

2
ответ дан 31 October 2019 в 13:36