usando REG ADD no PowerShell para adicionar a chave do registro com aspas duplas

3

Estou tentando adicionar chaves de registro ao Windows 10 usando um script do PowerShell. A chave no registro deve ter aspas duplas incluídas no campo de dados, então eu entendo que devo escapar da aspa dupla com uma barra invertida.

O comando de exemplo a seguir lança um erro de sintaxe quando executado no Powershell, mas funciona perfeitamente em uma janela de prompt de comando:

REG ADD \COMPUTER1\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\dcpm-notify /v ImagePath /t REG_EXPAND_SZ /d "\"C:\Program Files\Dell\CommandPowerManager\NotifyService.exe\"" /f

Eu tentei alterar os caracteres de escape para 'e usando' "" etc, mas não consigo fazer com que nenhuma combinação funcione em um PowerShell.

Qualquer sugestão muito apreciada.

    
por GOB 07.12.2016 / 19:01

3 respostas

1

Você pode usar [Microsoft.Win32.RegistryKey] para adicionar a chave.

Por exemplo:

$RemoteReg = [Microsoft.Win32.RegistryKey]::OpenRemoteBaseKey('LocalMachine',$TargetComp)
$NewKey = $RemoteReg.OpenSubKey("SYSTEM\CurrentControlSet\Services\")
$NewKey.CreateSubKey('dcpm-notify')
$NewValue = $RemoteReg.OpenSubKey("SYSTEM\CurrentControlSet\Services\dcpm-notify")
$NewValue.SetValue('ImagePath', 'C:\Program Files\Dell\CommandPowerManager\NotifyService.exe')

Onde $TargetComp é um computador para o qual você deseja editar o registro.

Por favor, note que eu não testei o código exato, mas eu usei algo muito semelhante a isso no passado e funciona sem nenhum problema. Então, execute isso em um sistema de teste primeiro, se houver alguma coisa.

    
por 07.12.2016 / 19:36
2

Como você está usando o PowerShell, sugiro usar os cmdlets New-Item e New-ItemProperty em vez de Reg.exe, pois eles permitem que você inclua aspas com escape.

E.G:

$registryPath = "HKLM:\SYSTEM\CurrentControlSet\Services\dcpm-notify"
$name = "ImagePath"
$value = "'"C:\Program Files\Dell\CommandPowerManager\NotifyService.exe'""

# If registry path doesn't exist, create it.
If (-NOT (Test-Path $registryPath)) {
    New-Item $registryPath | Out-Null
}

New-ItemProperty -Path $registryPath '
    -Name $name '
    -Value $value '
    -PropertyType ExpandString '
    -Force | Out-Null

Nota: Este exemplo é direcionado para a máquina local. Para executá-lo em computadores remotos, procure usar o Cmdlet Invoke-Command do PowerShell para invocar os comandos acima no (s) computador (es) remoto (s).

    
por 07.12.2016 / 19:44
0

A resposta mais fácil seria usar aspas simples ao redor do texto para que as aspas duplas se tornassem texto por si só.

Seu comando se tornaria:

REG ADD \COMPUTER1\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\dcpm-notify /v ImagePath /t REG_EXPAND_SZ /d '"C:\Program Files\Dell\CommandPowerManager\NotifyService.exe"' /f

Para explicar mais:

O Powershell conhece duas maneiras de trabalhar com texto.

$test = "This is a test"
$test2 = 'This is also a test'

Como o acima funciona, ele permite que você faça isso:

$test3 = 'This is "double quoted" text'
$test4 = "This is 'single quoted' text"

E se você precisar de uma string com os dois, você pode fazer isso da seguinte maneira:

$test5 = 'This is "double quoted" and ' + "'single quoted' text in one"
    
por 07.12.2016 / 22:22