new itemproperty hklm variables powershell registrykey

variables - itemproperty - ¿Cómo obtengo el valor de una clave de registro y SÓLO el valor usando powershell?



new-itemproperty (8)

¿Alguien puede ayudarme a extraer el valor de una clave de registro y colocarla en una variable en PowerShell? Hasta ahora he usado Get-ItemProperty y reg query y aunque ambos Get-ItemProperty el valor, ambos también agregan texto adicional. Necesito solo el texto de la cadena de la clave de registro y SÓLO el texto de la cadena de la clave. Estoy seguro de que podría crear una función para quitar el texto adicional, pero si algo cambia (es decir, el nombre de la clave de registro) podría afectar esto.


Bueno, necesitas ser específico aquí. Hasta donde yo sé, la clave en un registro es una "carpeta" de propiedades. Entonces, ¿quiso decir obtener el valor de una propiedad? Si es así, intente algo como esto:

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

Primero obtenemos un objeto que contiene la propiedad que necesitamos con Get-ItemProperty y luego obtenemos el valor de la propiedad que necesitamos de ese objeto. Eso devolverá el valor de la propiedad como una cadena. El ejemplo anterior le brinda la versión PS para "legacy" / compatibility-mdoe powershell (1.0 o 2.0).


Dada una clave /SQL con dos propiedades:

Me gustaría obtener el "MSSQLSERVER" con los siguientes en-casos en los que no estaba seguro de cuál sería el nombre de la propiedad para utilizar la notación de puntos:

$regkey_property_name = ''MSSQLSERVER'' $regkey = get-item -Path ''HKLM:/Software/Microsoft/Microsoft SQL Server/Instance Names/SQL'' $regkey.GetValue($regkey_property_name)


El siguiente código enumerará todos los valores de una determinada clave del Registro, los ordenará y devolverá el nombre del valor: pares de valores separados por dos puntos (:):

$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; };

Me gusta esto:

DbgJITDebugLaunchSetting: 16

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

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


NINGUNA de estas respuestas funciona para situaciones donde 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_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

Si desea acceder a cualquiera de los valores 14.0, 12.0, 11.0, 15.0, la solución de la respuesta aceptada no funcionará : no obtendrá ningún resultado:

PS> (Get-ItemProperty Registry::HKEY_LOCAL_MACHINE/SOFTWARE/WOW6432Node/Microsoft/VisualStudio/SxS/VS7 -Name 15.0).15.0 PS>

Lo que hace el trabajo es citar el nombre del valor, que probablemente debería estar haciendo de todos modos por seguridad:

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>

Por lo tanto, la respuesta aceptada debe modificarse como tal:

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>

Esto funciona en PowerShell 2.0 a 5.0 (aunque probablemente debería utilizar Get-ItemPropertyValue en v5).


No estoy seguro de si esto se ha modificado, o si tiene algo que ver con la versión de PS que está utilizando, pero utilizando el ejemplo de Andy, puedo eliminar el parámetro -Name y todavía obtengo el valor del elemento de registro :

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


Si crea un objeto, obtiene un resultado más legible y también gana un objeto con propiedades a las que puede acceder:

$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

Resultado de muestra: InstallRoot: C: / Windows / Microsoft.NET / Framework /

Y el objeto: $ obj.InstallRoot = C: / Windows / Microsoft.NET / Framework /

La verdad del asunto es que esto es mucho más complicado de lo que necesita ser. Aquí hay un ejemplo mucho mejor, y mucho más simple:

$path = ''HKLM:/SOFTWARE/Wow6432Node/Microsoft/.NETFramework'' $objReg = Get-ItemProperty -Path $path | Select -Property *

$ objReg ahora es un objeto personalizado donde cada entrada de registro es un nombre de propiedad. Puede ver la lista formateada a través de:

write-output $objReg InstallRoot : C:/Windows/Microsoft.NET/Framework/ DbgManagedDebugger : "C:/windows/system32/vsjitdebugger.exe"

Y tienes acceso al objeto en sí:

$objReg.InstallRoot C:/Windows/Microsoft.NET/Framework/


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

Nunca me gustó cómo se implementó este proveedor así: /

Básicamente, hace que cada valor de registro sea un objeto PSCustomObject con PsPath , PsParentPath , PsChildname , PSDrive y PSProvider y luego una propiedad para su valor real. Entonces, aunque haya pedido el artículo por su nombre, para obtener su valor, debe usar el nombre una vez más.


  • La respuesta útil de Andy Arismendi explica la molestia de tener que repetir el nombre del valor para obtener los datos de valor de manera eficiente .
  • La respuesta útil de M Jeremy Carter es más conveniente , pero puede ser un obstáculo de rendimiento para las claves con una gran cantidad de valores, ya que se debe construir un objeto con un gran número de propiedades.

Nota: Todas las soluciones a continuación pasan por alto el problema descrito en la respuesta de Ian Kemp : la necesidad de utilizar citas explícitas para ciertos nombres de valores cuando se usan como nombres de propiedad ; 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 una variable ; por ejemplo .$ValueName

Harry Martyrossian menciona en un comentario sobre su propia respuesta que el
Get-ItemPropertyValue cmdlet Get-ItemPropertyValue se introdujo en Powershell v5 , que resuelve el problema:

PS> Get-ItemPropertyValue ''HKLM:/SOFTWARE/Microsoft/Windows/CurrentVersion'' ''ProgramFilesDir'' C:/Program Files

Alternativas para PowerShell v4- :

Aquí hay un intento de conservar la eficiencia al tiempo que elimina la necesidad de repetir el nombre del valor, que, sin embargo, sigue siendo un poco engorroso:

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

Al usar un bloque de script, el nombre del valor se puede pasar una vez como parámetro, y la variable de parámetro ( $args ) puede simplemente usarse dos veces dentro del bloque.

Alternativamente, una simple función auxiliar puede aliviar el dolor:

function Get-RegValue([String] $KeyPath, [String] $ValueName) { (Get-ItemProperty -LiteralPath $KeyPath -Name $ValueName).$ValueName }