REG ADD REG_SZ 値に埋め込まれた二重引用符が含まれる場合 (redux)

REG ADD REG_SZ 値に埋め込まれた二重引用符が含まれる場合 (redux)

これは私を困惑させていますが、非常に単純なことのはずです。REG ADD を使用してバッチ スクリプト内のサービスの ImagePath 値 (REG_SZ) を変更しようとしています。値データには埋め込まれた「二重引用符」が含まれています。しかし、「無効な構文」エラーが繰り返し発生します。追加しようとしている値は次のとおりです。

Key  : HKLM\SYSTEM\CurrentControlSet\Services\myservice
Value: ImagePath REG_SZ
Data : "c:\program files\mydir\old.exe" -helloworld

ImagePath を次のように変更しようとしています:

Data: "c:\program files\mydir\new.exe" -helloworld

しかし、REG ADD コマンドで構文エラーが発生します。以下は簡略化されたスクリプトです。

@echo off
setlocal ENABLEDELAYEDEXPANSION ENABLEEXTENSIONS
for /f "tokens=2*" %%A in ('REG.EXE QUERY "HKLM\SYSTEM\CurrentControlSet\Services\myservice" /v ImagePath') DO set IPATHOLD=%%B
SET IPATHOLD=%IPATHOLD:\0= %
echo OLDPATH^=%IPATHOLD%
set "OLDEXE=old.exe"
set "NEWEXE=new.exe"
for /f "delims=" %%A in ("%IPATHOLD%") do (
    set "string=%%A"
    set "IPATHNEW=!string:%OLDEXE%=%NEWEXE%!"
)
echo NEWPATH^=%IPATHNEW%
@echo on
@pause
if !IPATHNEW! NEQ !IPATHOLD! (
    @echo ready to change
    @REM next line results in Syntax Error
    REG ADD "HKLM\SYSTEM\CurrentControlSet\Services\myservice" /v ImagePath /t REG_SZ /d "%IPATHNEW%" /f
)

「二重引用符」、「一重引用符」、「角括弧」、\バックスラッシュ\ で囲んでみました%IPATHNEW%が、構文エラーが発生し続けます。

何が間違っているのか分かりますか?

(注 - これはこの質問の代わりです: REG ADD REG_SZ 値に二重引用符が埋め込まれている

答え1

探しているコマンドは、おそらく次のもの"に置き換えられるものです\":

    set "IPATHNEW=!IPATHNEW:"=^\"!"

スクリプトは次のようになります。

setlocal ENABLEDELAYEDEXPANSION ENABLEEXTENSIONS
for /f "tokens=2*" %%A in ('REG.EXE QUERY "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\myservice" /v ImagePath') DO set IPATHOLD=%%B
set "IPATHNEW=!IPATHOLD:old=new!"
set "IPATHNEW=!IPATHNEW:"=^\"!"
echo "%IPATHNEW%"
@pause
if !IPATHNEW! NEQ !IPATHOLD! (
    REG ADD "HKLM\SYSTEM\CurrentControlSet\Services\myservice" /v ImagePath /t REG_SZ /d "%IPATHNEW%" /f
)

部分的にテストしてみましたが、うまく機能しているようでした。

関連情報