Solución:
$key = 'HKLM:SOFTWAREMicrosoftWindowsCurrentVersion'
(Get-ItemProperty -Path $key -Name ProgramFilesDir).ProgramFilesDir
Nunca me gustó cómo se implementó este proveedor de esta manera: /
Básicamente, hace que cada valor de registro sea un PSCustomObject
objeto con PsPath
, PsParentPath
, PsChildname
, PSDrive
y PSProvider
propiedades y luego una propiedad por su valor real. Entonces, aunque solicitó el artículo por su nombre, para obtener su valor, debe usar el nombre una vez más.
NINGUNA de estas respuestas funciona para situaciones en las que el nombre del valor contiene espacios, puntos u otros caracteres que están reservados en PowerShell. En ese caso, debe envolver el nombre entre comillas dobles según http://blog.danskingdom.com/accessing-powershell-variables-with-periods-in-their-name/, por ejemplo:
PS> Get-ItemProperty Registry::HKEY_LOCAL_MACHINESOFTWAREWOW6432NodeMicrosoftVisualStudioSxSVS7
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 Studio2017Enterprise
PSPath : Microsoft.PowerShell.CoreRegistry::HKEY_LOCAL_MACHINESOFTWAREWOW6432NodeMicrosoftVisualStudioSxSV
S7
PSParentPath : Microsoft.PowerShell.CoreRegistry::HKEY_LOCAL_MACHINESOFTWAREWOW6432NodeMicrosoftVisualStudioSxS
PSChildName : VS7
PSProvider : Microsoft.PowerShell.CoreRegistry
Si desea acceder a cualquiera de los valores 14.0, 12.0, 11.0, 15.0, la solución de la respuesta aceptada no trabajará – no obtendrá salida:
PS> (Get-ItemProperty Registry::HKEY_LOCAL_MACHINESOFTWAREWOW6432NodeMicrosoftVisualStudioSxSVS7 -Name 15.0).15.0
PS>
Lo que sí funciona es citar el nombre del valor, que probablemente debería estar haciendo de todos modos por seguridad:
PS> (Get-ItemProperty "Registry::HKEY_LOCAL_MACHINESOFTWAREWOW6432NodeMicrosoftVisualStudioSxSVS7" -Name "15.0")."15.0"
C:Program Files (x86)Microsoft Visual Studio2017Enterprise
PS>
Por lo tanto, la respuesta aceptada debe modificarse como tal:
PS> $key = "Registry::HKEY_LOCAL_MACHINESOFTWAREWOW6432NodeMicrosoftVisualStudioSxSVS7"
PS> $value = "15.0"
PS> (Get-ItemProperty -Path $key -Name $value).$value
C:Program Files (x86)Microsoft Visual Studio2017Enterprise
PS>
Esto funciona en PowerShell 2.0 a 5.0 (aunque probablemente debería usar Get-ItemPropertyValue
en v5).
Harry Martyrossian menciona en un comentario sobre su propia respuesta que el
Get-ItemPropertyValue cmdlet se introdujo en Powershell v5, que resuelve el problema:
PS> Get-ItemPropertyValue 'HKLM:SOFTWAREMicrosoftWindowsCurrentVersion' 'ProgramFilesDir'
C:Program Files
Alternativas para PowerShell v4-:
Aquí hay un intento de mantener la eficiencia mientras se elimina la necesidad de repetir el nombre del valor, que, sin embargo, sigue siendo un poco engorroso:
& { (Get-ItemProperty `
-LiteralPath HKLM:SOFTWAREMicrosoftWindowsCurrentVersion `
-Name $args `
).$args } 'ProgramFilesDir'
Mediante el uso de un bloque de secuencia de comandos, el nombre del valor se puede pasar en una vez como parámetro, y la variable de parámetro ($args
) se puede utilizar simplemente dos veces dentro del bloque.
Alternativamente, una simple función de ayuda puede aliviar el dolor:
function Get-RegValue([String] $KeyPath, [String] $ValueName) {
(Get-ItemProperty -LiteralPath $KeyPath -Name $ValueName).$ValueName
}
Nota: todas las soluciones anteriores derivación el problema descrito en la respuesta de Ian Kemp: la necesidad de usar comillas explícitas para ciertos nombres de valores cuando se usan como propiedad nombres; p.ej, .'15.0'
– porque los nombres de los valores se pasan como parámetros y el acceso a la propiedad ocurre a través de un variable; p.ej, .$ValueName
En cuanto a las otras respuestas:
- La útil respuesta de Andy Arismendi explica la molestia de tener que repetir el nombre del valor para obtener los datos del valor eficientemente.
- La útil respuesta de M Jeremy Carter es más conveniente, pero puede ser un escollo de rendimiento para claves con un gran número de valores, porque se debe construir un objeto con un gran número de propiedades.