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.
- Recupere el valor actual de la entrada Path mediante
Get-ItemProperty
. - Agregue el nuevo valor y sepárelo con un
;
. - 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