Как получить значение раздела реестра и только значение с помощью 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
с двумя свойствами:
Я бы взял" 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\