回答:
マジック変数%
nには、ファイルの呼び出しに使用される引数が含まれています。%0
はbatファイル自体へのパス、%1
は最初の引数、%2
は2番目、というように続きます。
引数は多くの場合ファイルパスであるため、パスの一部を抽出するための追加の構文があります。~d
ドライブ、~p
パス(ドライブなし)、~n
ファイル名です。それらは組み合わせること~dp
ができるので、ドライブ+パスです。
%~dp0
したがって、バットで非常に便利です。これは、実行中のバットファイルが存在するフォルダです。
ファイルに関する他の種類のメタ情報を取得することもできます:~t
はタイムスタンプ、~z
はサイズです。
すべてのコマンドラインコマンドのリファレンスについては、こちらをご覧ください。チルダマジックコードについては、で説明しています。
%~d0
とは%~d0%
?
これらは拡張変数置換です。バッチファイルで使用される%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 /?
ます。
はい、使用できる他のショートカットが以下に示されています。コマンドでは、〜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 /?
%~s0
完全なスクリプト名についても説明します。
非常に役立つもう1つのヒントは、現在のディレクトリを別のドライブに設定するには、%~d0
最初に使用してからを使用する必要があるということcd %~dp0
です。これにより、ディレクトリがバッチファイルのドライブに変更され、そのフォルダーに移動します。
#oneLinerLoversの場合cd /d %~dp0
、ドライブとディレクトリの両方を変更します:)
これが誰かを助けることを願っています。
pushd %~dp0
、現在のドライブを変更しても問題がなく、popd
後で元のドライブ/パスに戻ることができるという追加のボーナスがあります。
%~d0
引数0(スクリプト名)のドライブ文字%~p0
、パスを指定します。
注意すべきいくつかの落とし穴:
バッチファイルをダブルクリック%0
すると、引用符で囲まれます。たとえば、このファイルをc:\test.bat
次のように保存するとします。
@echo %0
@pause
それをダブルクリックすると、出力を含む新しいコマンドプロンプトが開きます。
"C:\test.bat"
あなたが最初のプロンプトのコマンドを開き、そのコマンドプロンプトから直接呼び出す場合しかし、%0
あなたがきた何を指します型付けされました。あなたが入力した場合test.bat
Enterの出力は%0
、あなたが何の引用符を入力しないので、何の引用符を持っていません。
c:\>test.bat
test.bat
とtest
Enter入力%0
すると、拡張子も入力しなかったため、出力にも拡張子は付きません。
c:\>test
test
同じ tEsT
Enter:
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
マイナス引用符(ある場合)の出力であるためです。
現在表示されているファイルまたはディレクトリの現在の場所が表示されます。たとえば、バッチファイルがデスクトップディレクトリにある場合、「%〜dp0」はデスクトップディレクトリを表示します。現在のファイル名で現在のディレクトリを表示したい場合は、「%〜dp0%〜n0%〜x0」と入力します。
echo %~dp0
コマンドラインでは機能せず、バッチファイルでのみ機能します。ああ!