結論
Powershellのコマンドを叩いて、環境変数に代入する。
相対パスを絶対パスに変換して環境変数に代入
REM 末尾に\を付ける
if not [%BASE_PATH:~-1%] == [\\] (set BASE_PATH=%BASE_PATH%\)
REM 絶対パスを標準出力するコマンド
set COMMAND=powershell "[uri]::new([uri] '%BASE_PATH%', '%RELATIVE_PATH%').LocalPath"
REM 絶対パスを環境変数に代入する
for /f "usebackq" %I in (`%COMMAND%`) do set ABSOLUTE_PATH=%I
バッチファイル内に書く場合は最後の行を下のようにする(%I
を%%I
に置換)。
バッチファイル用
for /f "usebackq" %%I in (`%COMMAND%`) do set ABSOLUTE_PATH=%%I
カレントディレクトリの一つ上のディレクトリの絶対パスが欲しい場合は下のように書ける。
set COMMAND=powershell "[uri]::new([uri] '%cd%\', '..').LocalPath"
for /f "usebackq" %I in (`%COMMAND%`) do set ABSOLUTE_PATH=%I
これを一行で書くと下のようになる。
for /f "usebackq" %I in (`powershell "[uri]::new([uri] '%cd%\', '..').LocalPath"`) do set ABSOLUTE_PATH=%I
末尾に\
を付ける理由
末尾に/
もしくは\
が付いていないとディレクトリとみなされず、階層がずれてしまう。
Powershell実行結果
> [uri]::new([uri]'c:\hoge\fuga', '..').LocalPath
c:\
> [uri]::new([uri]'c:\hoge\fuga\', '..').LocalPath
c:\hoge\
伝統的な手法
一度カレントディレクトリを移動し、移動先のカレントディレクトリの絶対パスを環境変数に代入して戻る。目的のパスが存在しない場合は利用できない。
pushd %RELATIVE_PATH%
set ABSOLUTE_PATH=%cd%
popd
参考