web-dev-qa-db-ja.com

PowerShellでREG ADDを使用して、二重引用符でレジストリキーを追加する

PowerShellスクリプトを使用してWindows 10にレジストリキーを追加しようとしています。レジストリのキーのデータフィールドには二重引用符が含まれている必要があるため、二重引用符をバックスラッシュでエスケープする必要があることを理解しています。

次のコマンド例は、Powershellで実行すると構文エラーをスローしますが、コマンドプロンプトウィンドウでは完全に機能します。

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

エスケープ文字を `に変更して「"」などを使用してみましたが、PowerShellで組み合わせを機能させることができません。

どんな提案も大歓迎です。

3
GOB

[Microsoft.Win32.RegistryKey]を使用してキーを追加できます。

例えば:

$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')

$TargetCompは、レジストリを編集するコンピュータです。

正確なコードはテストしていませんが、これと非常によく似たものを使用しており、問題なく動作していることに注意してください。ですから、これをテストシステムで最初に実行してください。

1
shinjijai

PowerShellを使用しているので、Reg.exeではなくNew-ItemおよびNew-ItemPropertyコマンドレットを使用することをお勧めします。エスケープされた引用符を含めることができるからです。

例えば:

$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

注:この例は、ローカルマシンを対象としています。リモートコンピューターに対して実行するには、 Invoke-Command PowerShellコマンドレットを使用して、リモートコンピューターで上記のコマンドを呼び出します。

3

最も簡単な答えは、テキストを一重引用符で囲み、二重引用符がそれ自体でテキストになるようにすることです。

あなたのコマンドは次のようになります:

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

それをさらに説明するには:

Powershellはテキストを処理する2つの方法を知っています。

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

上記が機能するため、これを行うことができます:

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

また、両方を含む文字列が必要な場合は、次のように実行できます。

$test5 = 'This is "double quoted" and ' + "'single quoted' text in one"
0
LPChip