Compartir a través de


Trabajar con entradas del Registro

Este ejemplo solo se aplica a las plataformas Windows.

Las entradas del Registro son propiedades de claves y, como tales, no se pueden examinar de forma directa, de modo que es preciso adoptar un enfoque ligeramente diferente al trabajar con ellas.

Enumeración de entradas del Registro

Existen muchas formas de examinar entradas del Registro. La más sencilla consiste en obtener los nombres de propiedad asociados a una clave. Por ejemplo, para ver los nombres de las entradas en la clave de Registro HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion, utilice Get-Item. Las claves del Registro tienen una propiedad con el nombre genérico "Property" que es una lista de entradas del Registro en la clave. Con el siguiente comando se selecciona la propiedad Property y se expanden los elementos de forma que se muestran en una lista:

Get-Item -Path Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion |
    Select-Object -ExpandProperty Property
DevicePath
MediaPathUnexpanded
ProgramFilesDir
CommonFilesDir
ProductId

Para ver las entradas del Registro en un formato más legible, use Get-ItemProperty:

Get-ItemProperty -Path Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion
ProgramFilesDir          : C:\Program Files
CommonFilesDir           : C:\Program Files\Common Files
ProgramFilesDir (x86)    : C:\Program Files (x86)
CommonFilesDir (x86)     : C:\Program Files (x86)\Common Files
CommonW6432Dir           : C:\Program Files\Common Files
DevicePath               : C:\WINDOWS\inf
MediaPathUnexpanded      : C:\WINDOWS\Media
ProgramFilesPath         : C:\Program Files
ProgramW6432Dir          : C:\Program Files
SM_ConfigureProgramsName : Set Program Access and Defaults
SM_GamesName             : Games
PSPath                   : Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\SOFTWA
                           RE\Microsoft\Windows\CurrentVersion
PSParentPath             : Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\SOFTWA
                           RE\Microsoft\Windows
PSChildName              : CurrentVersion
PSDrive                  : HKLM
PSProvider               : Microsoft.PowerShell.Core\Registry

Las propiedades relativas a Windows PowerShell de la clave tienen antepuesto el prefijo "PS", como PSPath, PSParentPath, PSChildName y PSProvider.

Puede usar la notación *.* para hacer referencia a la ubicación actual. Puede usar Set-Location para cambiar al contenedor del Registro CurrentVersion en primer lugar:

Set-Location -Path Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion

Otra opción consiste en usar el elemento integrado HKLM: PSDrive con Set-Location:

Set-Location -Path HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion

Luego, puede usar la notación . de la ubicación actual para enumerar las propiedades sin especificar una ruta de acceso completa:

Get-ItemProperty -Path .
...
DevicePath          : C:\WINDOWS\inf
MediaPathUnexpanded : C:\WINDOWS\Media
ProgramFilesDir     : C:\Program Files
...

La expansión de la ruta de acceso funciona igual que lo hace en el sistema de archivos, así que desde esta ubicación se puede obtener la lista ItemProperty para HKLM:\SOFTWARE\Microsoft\Windows\Help mediante Get-ItemProperty -Path ..\Help.

Obtención de una sola entrada del Registro

Si quiere recuperar una entrada específica de una clave del Registro, puede usar uno de los diversos métodos posibles existentes. Este ejemplo busca el valor de DevicePath en HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion.

Con Get-ItemProperty, use el parámetro Path para especificar el nombre de la clave y el parámetro Name para especificar el nombre de la entrada DevicePath.

Get-ItemProperty -Path HKLM:\Software\Microsoft\Windows\CurrentVersion -Name DevicePath
DevicePath   : C:\WINDOWS\inf
PSPath       : Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion
PSParentPath : Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\Software\Microsoft\Windows
PSChildName  : CurrentVersion
PSDrive      : HKLM
PSProvider   : Microsoft.PowerShell.Core\Registry

Este comando devuelve las propiedades estándar de Windows PowerShell, así como la propiedad DevicePath.

Nota

Aunque Get-ItemProperty tiene los parámetros Filter, Include y Exclude, no se pueden usar para filtrar por nombre de propiedad. Estos parámetros hacen referencia a claves del Registro (que son rutas de acceso de los elementos) y no a entradas del Registro (que son propiedades de los elementos).

Otra opción sería usar la herramienta de línea de comandos reg.exe. Para obtener ayuda con reg.exe, escriba reg.exe /? en un símbolo del sistema. Para encontrar la entrada DevicePath, use reg.exe tal y como se muestra en el siguiente comando:

reg query HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion /v DevicePath
! REG.EXE VERSION 3.0

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion
    DevicePath  REG_EXPAND_SZ   %SystemRoot%\inf

También puede usar el objeto COM WshShell para encontrar algunas entradas del Registro, aunque este método no funciona con datos binarios de gran tamaño o con nombres de entradas del Registro que contengan caracteres como una barra diagonal inversa (\). Anexe el nombre de la propiedad a la ruta de acceso de elemento con un separador \:

(New-Object -ComObject WScript.Shell).RegRead("HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\DevicePath")
%SystemRoot%\inf

Establecimiento de una sola entrada del Registro

Si quiere cambiar una entrada específica de una clave del Registro, puede usar uno de los diversos métodos posibles existentes. En este ejemplo, se modifica la entrada Path bajo HKEY_CURRENT_USER\Environment. La entrada Path especifica dónde encontrar los archivos ejecutables.

  1. Recupere el valor actual de la entrada Path mediante Get-ItemProperty.
  2. Agregue el nuevo valor y sepárelo con un ;.
  3. Use Set-ItemProperty con la clave especificada, el nombre de la entrada y el valor para modificar la entrada del Registro.
$value = Get-ItemProperty -Path HKCU:\Environment -Name Path
$newpath = $value.Path += ";C:\src\bin\"
Set-ItemProperty -Path HKCU:\Environment -Name Path -Value $newpath

Nota

Aunque Set-ItemProperty tiene los parámetros Filter, Include y Exclude, no se pueden usar para filtrar por nombre de propiedad. Estos parámetros hacen referencia a claves del Registro (que son rutas de acceso de los elementos) y no a entradas del Registro (que son propiedades de los elementos).

Otra opción sería usar la herramienta de línea de comandos Reg.exe. Para obtener ayuda con reg.exe, escriba reg.exe /? en un símbolo del sistema.

En el ejemplo siguiente se cambia la entrada Path mediante la eliminación de la ruta de acceso que se agregó en el ejemplo anterior. Get-ItemProperty aún se utiliza para recuperar el valor actual para evitar tener que analizar la cadena devuelta desde reg query. Los métodos SubString y LastIndexOf se usan para recuperar la última ruta de acceso que se agrega a la entrada Path.

$value = Get-ItemProperty -Path HKCU:\Environment -Name Path
$newpath = $value.Path.SubString(0, $value.Path.LastIndexOf(';'))
reg add HKCU\Environment /v Path /d $newpath /f
The operation completed successfully.

Creación de entradas del Registro

Para agregar una nueva entrada denominada "PowerShellPath" a la clave CurrentVersion, use New-ItemProperty con la ruta de acceso a la clave, el nombre de la entrada y el valor de la entrada. En este ejemplo, tomaremos el valor de la variable de Windows PowerShell $PSHome, que almacena la ruta de acceso al directorio de instalación de Windows PowerShell.

Puede agregar la nueva entrada a la clave usando el siguiente comando; este comando también devolverá información sobre la nueva entrada:

$newItemPropertySplat = @{
    Path = 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion'
    Name = 'PowerShellPath'
    PropertyType = 'String'
    Value = $PSHome
}
New-ItemProperty @newItemPropertySplat
PSPath         : Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion
PSParentPath   : Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows
PSChildName    : CurrentVersion
PSDrive        : HKLM
PSProvider     : Microsoft.PowerShell.Core\Registry
PowerShellPath : C:\Program Files\Windows PowerShell\v1.0

PropertyType debe ser el nombre de un miembro de la enumeración Microsoft.Win32.RegistryValueKind en la siguiente tabla:

  • String: se usa para los valores de REG_SZ. Pasar un objeto [System.String] al parámetro Valor.
  • ExpandString: se usa para los valores de REG_EXPAND_SZ. Pasar un objeto [System.String] al parámetro Valor. La cadena debe contener referencias no expandidas a variables de entorno que se expanden cuando se recupera el valor.
  • Binary: se usa para los valores de REG_BINARY. Pasar un objeto [System.Byte[]] al parámetro Valor.
  • DWord: se usa para los valores de REG_DWORD. Pasar un objeto [System.Int32] al parámetro Valor.
  • MultiString: se usa para los valores de REG_MULTI_SZ. Pasar un objeto [System.String[]] al parámetro Valor.
  • QWord: se usa para los valores de REG_QWORD. Pasar un objeto [System.Int64] al parámetro Valor.

Una entrada del Registro se puede agregar a varias ubicaciones si se especifica una matriz de valores para el parámetro Path:

$newItemPropertySplat = @{
    Name = 'PowerShellPath'
    PropertyType = 'String'
    Value = $PSHome
    Path = 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion',
           'HKCU:\SOFTWARE\Microsoft\Windows\CurrentVersion'
}
New-ItemProperty @newItemPropertySplat

Un valor de entrada del Registro preexistente también se puede sobrescribir si se agrega el parámetro Force a cualquier comando New-ItemProperty.

En los ejemplos siguientes se muestra cómo crear nuevas entradas del registro de varios tipos. Los valores del registro se crean en una nueva clave denominada MySoftwareKey en HKEY_CURRENT_USER\Software. La variable $key se usa para almacenar el nuevo objeto de clave.

$key = New-Item -Path HKCU:\Software -Name MySoftwareKey
$newItemPropertySplat = @{
    Path = $key.PSPath
    Name = 'DefaultFolders'
    PropertyType = 'MultiString'
    Value = 'Home', 'Temp', 'Publish'
}
New-ItemProperty @newItemPropertySplat
DefaultFolders : {Home, Temp, Publish}
PSPath         : Microsoft.PowerShell.Core\Registry::HKEY_CURRENT_USER\Software\MySoftwareKey
PSParentPath   : Microsoft.PowerShell.Core\Registry::HKEY_CURRENT_USER\Software
PSChildName    : MySoftwareKey
PSProvider     : Microsoft.PowerShell.Core\Registry

Puede usar la propiedad PSPath del objeto de clave en comandos posteriores.

New-ItemProperty -Path $key.PSPath -Name MaxAllowed -PropertyType QWord -Value 1024
MaxAllowed   : 1024
PSPath       : Microsoft.PowerShell.Core\Registry::HKEY_CURRENT_USER\Software\MySoftwareKey
PSParentPath : Microsoft.PowerShell.Core\Registry::HKEY_CURRENT_USER\Software
PSChildName  : MySoftwareKey
PSProvider   : Microsoft.PowerShell.Core\Registry

También puede canalizar $key a New-ItemProperty para agregar un valor a la clave.

$date = Get-Date -Format 'dd-MMM-yyyy'
$newItemPropertySplat = @{
    Name = 'BinaryDate'
    PropertyType = 'Binary'
    Value = ([System.Text.Encoding]::UTF8.GetBytes($date))
}
$key | New-ItemProperty @newItemPropertySplat
BinaryDate   : {51, 49, 45, 74…}
PSPath       : Microsoft.PowerShell.Core\Registry::HKEY_CURRENT_USER\Software\MySoftwareKey
PSParentPath : Microsoft.PowerShell.Core\Registry::HKEY_CURRENT_USER\Software
PSChildName  : MySoftwareKey
PSProvider   : Microsoft.PowerShell.Core\Registry

Al mostrar el contenido de $key se muestran las nuevas entradas.

$key
    Hive: HKEY_CURRENT_USER\Software

Name                           Property
----                           --------
MySoftwareKey                  DefaultFolders : {Home, Temp, Publish}
                               MaxAllowed     : 1024
                               BinaryDate     : {51, 49, 45, 74…}

En el ejemplo siguiente se muestra el tipo de valor para cada tipo de entrada del registro:

$key.GetValueNames() | Select-Object @{n='ValueName';e={$_}},
     @{n='ValueKind';e={$key.GetValueKind($_)}},
     @{n='Type';e={$key.GetValue($_).GetType()}},
     @{n='Value';e={$key.GetValue($_)}}
ValueName        ValueKind Type            Value
---------        --------- ----            -----
DefaultFolders MultiString System.String[] {Home, Temp, Publish}
MaxAllowed           QWord System.Int64    1024
BinaryDate          Binary System.Byte[]   {51, 49, 45, 74…}

Cambio del nombre de entradas del Registro

Para cambiar el nombre de la entrada PowerShellPath a "PSHome," use Rename-ItemProperty:

$renameItemPropertySplat = @{
    Path = 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion'
    Name = 'PowerShellPath'
    NewName = 'PSHome'
}
Rename-ItemProperty @renameItemPropertySplat

Para mostrar el valor cuyo nombre ha cambiado, agregue el parámetro PassThru al comando.

$renameItemPropertySplat = @{
    Path = 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion'
    Name = 'PowerShellPath'
    NewName = 'PSHome'
    PassThru = $true
}
Rename-ItemProperty @renameItemPropertySplat

Eliminación de entradas del Registro

Para eliminar las entradas del Registro PSHome y PowerShellPath, use Remove-ItemProperty:

Remove-ItemProperty -Path HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion -Name PSHome
Remove-ItemProperty -Path HKCU:\SOFTWARE\Microsoft\Windows\CurrentVersion -Name PowerShellPath