Кто-либо может помочь мне вытянуть значение ключа реестра и поместить его в переменную в PowerShell? До сих пор я использовал Get-ItemProperty
и reg query
и хотя оба вытянут значение, оба также добавляют дополнительный текст. Мне нужны просто строковый текст от ключа реестра и ТОЛЬКО строковый текст от ключа. Я уверен, что мог создать функцию для снятия изоляции с дополнительного текста, но если что-то изменяется (т.е. reg ключевое имя), это могло бы влиять на это.
$key = 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion'
(Get-ItemProperty -Path $key -Name ProgramFilesDir).ProgramFilesDir
мне никогда не нравилось, как это было поставщиком, был реализован как это: /
В основном, это заставляет каждый реестр оценить 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 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).
<глоток> Примечание: Все решения ниже обход проблема описала в 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
}
Я не уверен, было ли это изменено, или если это имеет некоторое отношение, какую версию 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
Учитывая ключ \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';
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\
При создании объекта Вы получаете более читаемый вывод и также получаете объект со свойствами, к которым можно получить доступ:
$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\
Хорошо необходимо быть конкретными здесь. Насколько я знаю, ключ в реестре является "папкой" свойств. Вы имеете в виду, получают значение свойства? Если так, попробуйте что-то вроде этого:
(Get-ItemProperty HKLM:\Software\Microsoft\PowerShell\1\PowerShellEngine -Name PowerShellVersion).PowerShellVersion
Первый мы получаем объект, содержащий свойство, в котором мы нуждаемся с Get-ItemProperty
, и затем мы получаем значение для свойства, в котором мы нуждаемся от того объекта. Это возвратит значение свойства как строка. Пример выше дает Вам версию PS для "наследия"/compatibility-mdoe powershell (1.0 или 2.0).