相対パスやファイル名から絶対パスを解決する 質問する

相対パスやファイル名から絶対パスを解決する 質問する

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

与えられた条件:

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

バッチファイルに対する絶対パスが必要です。

例:

  • 「somefile.txt」は「C:\Foo\」にあります
  • 「test.bat」は「C:\Foo\Bar」にあります。
  • ユーザーは「C:\Foo」でコマンドウィンドウを開き、Bar\test.bat ..\somefile.txt
  • バッチファイルでは「C:\Foo\somefile.txt」は以下から派生します。%1

ベストアンサー1

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

を使用すると、最初の引数の完全修飾パスを取得することもできます%~f1が、これは現在の作業ディレクトリに応じたパスを提供するため、明らかに必要なパスではありません。

個人的には、バッチ ファイルで、実行中のバッチのパスを基準にして最初の引数を解釈する慣用句をよく使用します%~dp0%~1。ただし、この慣用句には欠点があります。最初の引数が完全修飾されている場合、この慣用句は完全に失敗します。

両方の相対的なサポートが必要な場合はそして絶対パスを利用するにはフレデリック・メネスの解決策: 現在の作業ディレクトリを一時的に変更します。

以下に、これらの各テクニックを示す例を示します。

@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:\Users\Public>\temp\example.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://learn.microsoft.com/en-us/windows-server/administration/windows-commands/call

おすすめ記事