Partilhar via


Trabalhar com entradas do registo

Este exemplo só se aplica a plataformas Windows.

Como as entradas do Registro são propriedades de chaves e, como tal, não podem ser navegadas diretamente, precisamos adotar uma abordagem um pouco diferente ao trabalhar com elas.

Listando entradas do registro

Há muitas maneiras diferentes de examinar entradas do registro. A maneira mais simples é obter os nomes de propriedade associados a uma chave. Por exemplo, para ver os nomes das entradas na chave HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersiondo Registro, use Get-Item. As chaves do Registro têm uma propriedade com o nome genérico de "Propriedade" que é uma lista de entradas do Registro na chave. O comando a seguir seleciona a propriedade Property e expande os itens para que sejam exibidos em uma lista:

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

Para visualizar as entradas do registo num formato mais legível, utilize 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

As propriedades relacionadas ao Windows PowerShell para a chave são todas prefixadas com "PS", como PSPath, PSParentPath, PSChildName e PSProvider.

Você pode usar a *.* notação para se referir ao local atual. Você pode usar Set-Location para alterar para o contêiner do Registro CurrentVersion primeiro:

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

Como alternativa, você pode usar o PSDrive integrado HKLM: com Set-Location:

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

Em seguida, você pode usar a . notação para o local atual para listar as propriedades sem especificar um caminho completo:

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

A expansão de caminho funciona da mesma forma que dentro do sistema de arquivos, portanto, a partir deste local, você pode obter a listagem ItemProperty para HKLM:\SOFTWARE\Microsoft\Windows\Help usar Get-ItemProperty -Path ..\Helpo .

Obter uma única entrada de registo

Se você quiser recuperar uma entrada específica em uma chave do Registro, você pode usar uma das várias abordagens possíveis. Este exemplo localiza o valor de DevicePath em HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion.

Usando Get-ItemProperty, use o parâmetro Path para especificar o nome da chave e o parâmetro Name para especificar o nome da 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 retorna as propriedades padrão do Windows PowerShell, bem como a propriedade DevicePath .

Nota

Embora Get-ItemProperty tenha parâmetros Filtrar, Incluir e Excluir, eles não podem ser usados para filtrar por nome de propriedade. Esses parâmetros se referem a chaves do Registro, que são caminhos de item e não entradas do Registro, que são propriedades de item.

Outra opção é usar a ferramenta de linha de reg.exe comando. Para obter ajuda com reg.exeo , digite reg.exe /? em um prompt de comando. Para localizar a entrada DevicePath , use reg.exe como mostrado no comando a seguir:

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

Você também pode usar o objeto WshShell COM para localizar algumas entradas do Registro, embora esse método não funcione com dados binários grandes ou com nomes de entrada do Registro que incluam caracteres como barra invertida (\). Anexe o nome da propriedade ao caminho do item com um \ separador:

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

Definindo uma única entrada do Registro

Se você quiser alterar uma entrada específica em uma chave do Registro, você pode usar uma das várias abordagens possíveis. Este exemplo modifica a entrada Path em HKEY_CURRENT_USER\Environment. A entrada Path especifica onde encontrar arquivos executáveis.

  1. Recupere o valor atual da entrada Path usando Get-ItemProperty.
  2. Adicione o novo valor, separando-o com um ;arquivo .
  3. Use Set-ItemProperty com a chave especificada, o nome da entrada e o valor para modificar a entrada do 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

Embora Set-ItemProperty tenha parâmetros Filtrar, Incluir e Excluir, eles não podem ser usados para filtrar por nome de propriedade. Esses parâmetros referem-se a chaves do Registro — que são caminhos de item — e não entradas do Registro — que são propriedades de item.

Outra opção é usar a ferramenta de linha de comando Reg.exe. Para obter ajuda com reg.exe, digite reg.exe /? em um prompt de comando.

O exemplo a seguir altera a entrada Path removendo o caminho adicionado no exemplo acima. Get-ItemProperty ainda é usado para recuperar o valor atual para evitar ter que analisar a cadeia de caracteres retornada de reg query. Os métodos SubString e LastIndexOf são usados para recuperar o último caminho adicionado à 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.

Criando novas entradas do Registro

Para adicionar uma nova entrada chamada "PowerShellPath" à chave CurrentVersion , use New-ItemProperty com o caminho para a chave, o nome da entrada e o valor da entrada. Para este exemplo, tomaremos o valor da variável $PSHomeWindows PowerShell , que armazena o caminho para o diretório de instalação do Windows PowerShell.

Você pode adicionar a nova entrada à chave usando o seguinte comando, e o comando também retorna informações sobre a nova 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

O PropertyType deve ser o nome de um membro de enumeração Microsoft.Win32.RegistryValueKind da tabela a seguir:

  • String - Usado para valores REG_SZ. Passe um [System.String] objeto para o parâmetro Value .
  • ExpandString - Usado para REG_EXPAND_SZ valores. Passe um [System.String] objeto para o parâmetro Value . A cadeia de caracteres deve conter referências não expandidas a variáveis de ambiente que são expandidas quando o valor é recuperado.
  • Binary - Usado para REG_BINARY valores. Passe um [System.Byte[]] objeto para o parâmetro Value .
  • DWord - Usado para REG_DWORD valores. Passe um [System.Int32] objeto para o parâmetro Value .
  • MultiString - Usado para REG_MULTI_SZ valores. Passe um [System.String[]] objeto para o parâmetro Value .
  • QWord - Usado para REG_QWORD valores. Passe um [System.Int64] objeto para o parâmetro Value .

Você pode adicionar uma entrada do Registro a vários locais especificando uma matriz de valores para o parâmetro Path :

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

Você também pode substituir um valor de entrada do Registro pré-existente adicionando o parâmetro Force a qualquer New-ItemProperty comando.

Os exemplos a seguir mostram como criar novas entradas do Registro de vários tipos. Os valores do Registro são criados em uma nova chave chamada MySoftwareKey em HKEY_CURRENT_USER\Software. A $key variável é usada para armazenar o novo objeto de chave.

$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

Você pode usar a propriedade PSPath do objeto key em comandos subsequentes.

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

Você também pode canalizar $key para New-ItemProperty adicionar um valor à chave.

$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

A exibição do conteúdo do $key mostra as novas entradas.

$key
    Hive: HKEY_CURRENT_USER\Software

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

O exemplo a seguir mostra o tipo de valor para cada tipo de entrada do 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…}

Renomeando entradas do Registro

Para renomear a entrada PowerShellPath para "PSHome", use Rename-ItemProperty:

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

Para exibir o valor renomeado, adicione o parâmetro PassThru ao comando.

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

Excluindo entradas do Registro

Para excluir as entradas do Registro PSHome e PowerShellPath, use Remove-ItemProperty:

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