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