正しい値を取得していますが、値をエコーするときに解析の別のレイヤーを通過する必要があります。引用符なしは、や などの意味を持つ^
特殊文字を単純なリテラル文字に変換するために使用されるバッチ エスケープ文字です。引用符で囲まれていないキャレットに続く文字はすべてエスケープされ、キャレットが消費されます。&
|
文字列リテラルを単純に ECHO すると、まったく同じ結果が得られます。
echo C:\one^two^^three^^^four^^^^carets\
収量
C:\onetwo^three^four^^carets\
文字列を引用することでキャレットを保護できますが、ECHO 結果で引用符を取得します。
echo "%~dp0"
キャレットを消費せずに元の値を環境変数に簡単に転送し、SET を使用して結果を確認することでそれを証明できます。
@echo off
setlocal
set "myPath=%~dp0"
set myPath
引用符なしで値だけを ECHO したい場合は、遅延展開を使用できます。これは、特殊文字の解析後に遅延拡張が発生するために機能します。
@echo off
setlocal enableDelayedExpansion
set "myPath=%~dp0"
echo !myPath!
値を FOR 変数に転送することによっても、同じ結果を得ることができます。FOR 変数の展開は、特殊文字の解析後にも発生します。
@echo off
for %%A in ("%~dp0") do echo %%~A