Windowsバッチファイルで%〜d0はどういう意味ですか?


353

次の変数を定義するバッチファイルを見ています。

set _SCRIPT_DRIVE=%~d0
set _SCRIPT_PATH=%~p0
  • 何をするの%~d0か、%~p0実際に意味ですか?
  • 現在のディレクトリ、ドライブ、スクリプトのパラメーターなどの一連の既知の値はありますか?
  • 他に使用できる同様のショートカットはありますか?

回答:


539

マジック変数%nには、ファイルの呼び出しに使用される引数が含まれています。%0はbatファイル自体へのパス、%1は最初の引数、%2は2番目、というように続きます。

引数は多くの場合ファイルパスであるため、パスの一部を抽出するための追加の構文があります。~dドライブ、~pパス(ドライブなし)、~nファイル名です。それらは組み合わせること~dpができるので、ドライブ+パスです。

%~dp0 したがって、バットで非常に便利です。これは、実行中のバットファイルが存在するフォルダです。

ファイルに関する他の種類のメタ情報を取得することもできます:~tはタイムスタンプ、~zはサイズです。

すべてのコマンドラインコマンドのリファレンスについては、こちらご覧ください。チルダマジックコードについては、で説明しています。


15
自己注意:echo %~dp0コマンドラインでは機能せず、バッチファイルでのみ機能します。ああ!
northben 2015年

2
間に差がある%~d0とは%~d0%
ジェフリー

2
@Pacerier:%0は、スクリプトのファイル名を含むフルパスです。%〜dp0は、スクリプトを含むフォルダーへのパスですが、スクリプトのファイル名は除きます。
JacquesB

4
自己注意:(期待どおりの逆ではなく)echo %~pd0エコーと同じ出力を提供し%~dp0ます。また、バッチファイルをダブルクリックするか、cmdから実行するかによって、値%0異なります
Pacerier 2015

152

これらは拡張変数置換です。バッチファイルで使用される%N変数を変更します。Windowsでバッチプログラミングをしている場合は、非常に便利です。

%~I         - expands %I removing any surrounding quotes ("")
%~fI        - expands %I to a fully qualified path name
%~dI        - expands %I to a drive letter only
%~pI        - expands %I to a path only
%~nI        - expands %I to a file name only
%~xI        - expands %I to a file extension only
%~sI        - expanded path contains short names only
%~aI        - expands %I to file attributes of file
%~tI        - expands %I to date/time of file
%~zI        - expands %I to size of file
%~$PATH:I   - searches the directories listed in the PATH
               environment variable and expands %I to the
               fully qualified name of the first one found.
               If the environment variable name is not
               defined or the file is not found by the
               search, then this modifier expands to the
               empty string

上記を見つけるには、を実行しFOR /?ます。


48

はい、使用できる他のショートカットが以下に示されています。コマンドでは、〜d0は0番目の引数のドライブ文字を意味します。

~ expands the given variable
d gets the drive letter only
0 is the argument you are referencing

0番目の引数はスクリプトパスであるため、パスのドライブ文字を取得します。次のショートカットも使用できます。

%~1         - expands %1 removing any surrounding quotes (")
%~f1        - expands %1 to a fully qualified path name
%~d1        - expands %1 to a drive letter only
%~p1        - expands %1 to a path only
%~n1        - expands %1 to a file name only
%~x1        - expands %1 to a file extension only
%~s1        - expanded path contains short names only
%~a1        - expands %1 to file attributes
%~t1        - expands %1 to date/time of file
%~z1        - expands %1 to size of file
%~$PATH:1   - searches the directories listed in the PATH
               environment variable and expands %1 to the fully
               qualified name of the first one found.  If the
               environment variable name is not defined or the
               file is not found by the search, then this
               modifier expands to the empty string    

%~dp1       - expands %1 to a drive letter and path only
%~nx1       - expands %1 to a file name and extension only
%~dp$PATH:1 - searches the directories listed in the PATH
               environment variable for %1 and expands to the
               drive letter and path of the first one found.
%~ftza1     - expands %1 to a DIR like output line

これは、CALL /?を実行すると、コマンドプロンプトで直接確認することもできます。またはFOR /?



9

非常に役立つもう1つのヒントは、現在のディレクトリを別のドライブに設定するには、%~d0最初に使用してからを使用する必要があるということcd %~dp0です。これにより、ディレクトリがバッチファイルのドライブに変更され、そのフォルダーに移動します。

#oneLinerLoversの場合cd /d %~dp0、ドライブとディレクトリの両方を変更します:)

これが誰かを助けることを願っています。


7
別のオプションはpushd %~dp0、現在のドライブを変更しても問題がなく、popd後で元のドライブ/パスに戻ることができるという追加のボーナスがあります。
BCrist 2016年


6

注意すべきいくつかの落とし穴:

バッチファイルをダブルクリック%0すると、引用符で囲まれます。たとえば、このファイルをc:\test.bat次のように保存するとします。

@echo %0
@pause

それをダブルクリックすると、出力を含む新しいコマンドプロンプトが開きます。

"C:\test.bat"

あなたが最初のプロンプトのコマンドを開き、そのコマンドプロンプトから直接呼び出す場合しかし、%0あなたがきた何を指します型付けされました。あなたが入力した場合test.batEnterの出力は%0、あなたが何の引用符を入力しないので、何の引用符を持っていません。

c:\>test.bat
test.bat

testEnter入力%0すると、拡張子も入力しなかったため、出力にも拡張子は付きません。

c:\>test
test

同じ tEsTEnter

c:\>tEsT
tEsT

と入力する"test"Enterと、出力に%0は引用符が付けられます(入力したため)。拡張子はありません。

c:\>"test"
"test"

最後に、と入力する"C:\test.bat"と、ダブルクリックしたときとまったく同じように出力されます。

c:\>"C:\test.bat"
"C:\test.bat"

%0他のフォルダからスクリプトを呼び出すことができるため、これらの値がすべてではない可能性があることに注意してください。

c:\some_folder>/../teST.bAt
/../teST.bAt

上記のすべての例もに影響します%~0。これは、の出力%~0が単に%0 マイナス引用符(ある場合)の出力であるためです。


3

このコードは、〜tilda文字の使用を説明しています。これは、私にとって最も混乱したことです。これを理解すると、物事がはるかに理解しやすくなります。

@ECHO off
SET "PATH=%~dp0;%PATH%"
ECHO %PATH%
ECHO.
CALL :testargs "these are days" "when the brave endure"
GOTO :pauseit
:testargs
SET ARGS=%~1;%~2;%1;%2
ECHO %ARGS%
ECHO.
exit /B 0
:pauseit
pause

1

現在表示されているファイルまたはディレクトリの現在の場所が表示されます。たとえば、バッチファイルがデスクトップディレクトリにある場合、「%〜dp0」はデスクトップディレクトリを表示します。現在のファイル名で現在のディレクトリを表示したい場合は、「%〜dp0%〜n0%〜x0」と入力します。


"%〜dpnx0"のほうが良い
FrinkTheBrave
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.