0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

コマンドプロンプトで相対パスを絶対パスに変換して環境変数に代入する

Last updated at Posted at 2024-10-24

結論

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

参考

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?