1. ホーム
  2. windows

[解決済み] 相対パスやファイル名から絶対パスを解決する

2022-04-22 02:49:38

質問

Windowsのバッチスクリプトで、ファイル名や相対パスを含む値から、絶対パスを返す方法はありますか?

与えられた。

"..\"
"..\somefile.txt"

バッチファイルからの絶対パスが必要です。

  • "somefile.txt" is located in "C:\Foo"
  • "test.bat" is located in "C:\FooBar".
  • ユーザは、"C:Foo" でコマンドウィンドウを開き、以下のコマンドを呼び出します。 Bar\test.bat ..\somefile.txt
  • バッチファイル "C:\Foosomefile.txt" は、次のような内容です。 %1

解決方法は?

バッチファイルでは、標準的なCプログラムと同様に、引数0に現在実行中のスクリプトのパスが含まれます。このとき %~dp0 は、第0引数のパス部分(現在のスクリプト)だけを取得します。このパスは、常に完全修飾パスです。

また、第1引数の完全修飾パスを取得するために %~f1 しかし、これは現在の作業ディレクトリに従ったパスを提供し、あなたが望むものではないことは明らかです。

個人的によく使うのは %~dp0%~1 このイディオムは、第一引数を実行中のバッチのパスからの相対パスで解釈します。しかし、これには欠点がある。第一引数が完全に修飾されている場合、惨めに失敗してしまうのだ。

相対的な を使用することができます。 Frédéric Ménez氏の解決法 : 現在の作業ディレクトリを一時的に変更します。

ここでは、それぞれのテクニックを紹介する例を示します。

@echo off
echo %%~dp0 is "%~dp0"
echo %%0 is "%0"
echo %%~dpnx0 is "%~dpnx0"
echo %%~f1 is "%~f1"
echo %%~dp0%%~1 is "%~dp0%~1"

rem Temporarily change the current working directory, to retrieve a full path 
rem   to the first parameter
pushd .
cd %~dp0
echo batch-relative %%~f1 is "%~f1"
popd

これをc: \temp ⇄example.batとして保存し、c:⇄Users⇄Publicから実行すると

c:\UsersPublic>\tempexample.bat ...\windows

...次のような出力が観測されます。

%~dp0 is "C:\temp\"
%0 is "\temp\example.bat"
%~dpnx0 is "C:\temp\example.bat"
%~f1 is "C:\Users\windows"
%~dp0%~1 is "C:\temp\..\windows"
batch-relative %~f1 is "C:\Windows"

バッチ引数で許可される一連の修飾子についてのドキュメントは、ここにあります。 https://docs.microsoft.com/en-us/windows-server/administration/windows-commands/call