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で組み合わせを機能させることができません。
どんな提案も大歓迎です。
[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
は、レジストリを編集するコンピュータです。
正確なコードはテストしていませんが、これと非常によく似たものを使用しており、問題なく動作していることに注意してください。ですから、これをテストシステムで最初に実行してください。
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コマンドレットを使用して、リモートコンピューターで上記のコマンドを呼び出します。
最も簡単な答えは、テキストを一重引用符で囲み、二重引用符がそれ自体でテキストになるようにすることです。
あなたのコマンドは次のようになります:
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"