web-dev-qa-db-ja.com

%〜dp0とはどういう意味ですか、またどのように機能しますか?

私は%~dp0が非常に便利であると思います、そして私は私のバッチファイルをよりポータブルにするためにそれをたくさん使います。

しかし、ラベル自体は私にとって非常に不可解なようです... ~は何をしているのですか? dpはドライブとパスを意味しますか? 0は、ファイル名を含むバッチファイルへのパスである%0を参照していますか?

それとも単なる奇妙なラベルですか?

それが文書化された機能なのか、それとも廃止予定のものなのかも知りたいのですが。

919

呼び出し

for /?

コマンドラインでこの構文についてのヘルプを提供します(これはFORの外部でも使用できますが、これは単にヘルプが見つかる場所です)。

さらに、FOR変数参照の置換が強化されました。これで、次のオプションの構文を使用できます。

%~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

修飾子を組み合わせて複合的な結果を得ることができます。

%~dpI       - expands %I to a drive letter and path only
%~nxI       - expands %I to a file name and extension only
%~fsI       - expands %I to a full path name with short names only
%~dp$PATH:I - searches the directories listed in the PATH
               environment variable for %I and expands to the
               drive letter and path of the first one found.
%~ftzaI     - expands %I to a DIR like output line

上記の例では、%IとPATHは他の有効な値に置き換えることができます。 %〜構文は有効なFOR変数名で終了します。 %Iのような大文字の変数名を選択すると読みやすくなり、大文字と小文字を区別しない修飾子との混同を避けることができます。

「フルパス名」にはf、ドライブ文字にはd、パスにはpのようにさまざまな文字を使用でき、それらを組み合わせることができます。 %~はそれらのシーケンスのそれぞれの始まりであり、数字Iはそれがパラメータ%Iに対して作用することを示します(ここで%0はあなたが想定したようにバッチファイルの完全な名前です)。

731
schnaader

(最初に、この便利なリファレンスサイトをバッチ用にお勧めします: http://ss64.com/nt/

それからもう一つの役に立つ説明: http://htipe.wordpress.com/2008/10/09/the-dp0-variable/

%〜dp0変数

Windowsバッチファイル内で参照されたときの%〜dp0(これはゼロです)変数は、dという名前のリベット文字とpに展開されます。そのバッチファイルのath。

変数%0〜%9は、バッチファイルのコマンドラインパラメータを参照しています。 %1-%9は、バッチファイル名の後のコマンドライン引数を参照しています。 %0はバッチファイル自体を参照しています。

パーセント記号(%)の後にチルダ文字(〜)を続ける場合は、パラメーター番号の前に修飾子を挿入して、変数の展開方法を変更できます。 d修飾子はドライブ名に展開され、p修飾子はパラメータのパスに展開されます。

例:C:にbat_filesという名前のディレクトリがあり、そのディレクトリにexample.batという名前のファイルがあるとします。この場合、%〜dp0(dとpの修飾子を組み合わせたもの)はC:\ bat_filesに展開されます。

詳しい説明は このMicrosoftの記事 をご覧ください。

また、 このフォーラムのスレッド を調べてください。

そして here からのより明確な参照

  • %CmdCmdLine%はCMD.EXEに渡されたコマンドライン全体を返します。

  • %*は、最初のコマンドライン引数で始まるコマンドラインの残りを返します(Windows NT 4では、%*にも先行スペースがすべて含まれます)。

  • %nが有効なパスまたはファイル名(UNCなし)の場合、%~dnはドライブ文字%n(nは0から9までの範囲)を返します。

  • %nが有効なパスまたはファイル名(UNCなし)の場合、%~pnは%nのディレクトリを返します。

  • %nが有効なファイル名の場合、%~nnは%nのみのファイル名を返します

  • %nが有効なファイル名の場合、%~xnは%nのファイル拡張子のみを返します

  • %nが有効なファイル名またはディレクトリの場合、%~fnは完全修飾パス%nを返します。

追加1

不思議な~チルダ演算子についての良い参考文献が見つかりました。

%~文字列は percent tilde 演算子と呼ばれます。 %~0のような状況でそれを見つけることができます。

:~文字列は コロンチルダ 演算子と呼ばれます。 %SOME_VAR:~0,-1%のように見つけることができます。

追加2 - 1:12 PM 7/6/2018

%1-%9はコマンドライン引数を参照します。それらが有効なパス値ではない場合%~dp1 - %~dp9はすべて%~dp0と同じ値に展開されます。しかし有効なパス値であれば、独自のドライバ/パス値に展開されます。

例えば、(batch.bat)です。

@echo off
@echo ~dp0= %~dp0
@echo ~dp1= %~dp1
@echo ~dp2= %~dp2
@echo on

実行1:

D:\Workbench>batch arg1 arg2

~dp0= D:\Workbench\
~dp1= D:\Workbench\
~dp2= D:\Workbench\

実行2:

D:\Workbench>batch c:\123\a.exe e:\abc\b.exe

~dp0= D:\Workbench\
~dp1= c:\123\
~dp2= e:\abc\
295
smwikipedia

http://www.Microsoft.com/resources/documentation/windows/xp/all/proddocs/en-us/percent.mspx?mfr=true

バッチスクリプト内の変数%0は、実行中のバッチファイルの名前に設定されます。 ~dp%の間の0特殊構文は、基本的に変数%0を展開してドライブ名とパスを表示するように指示しています。

143
Andy White

%〜dp0は、実行中のバッチファイルの現在のディレクトリパスに展開されます。

明確に理解するために、ディレクトリにバッチファイルを作成しましょう。

C:\ script\test.bat

内容付き:

@echo off
echo %~dp0

コマンドプロンプトから実行すると、次のようになります。

C:\ script \

37
null

もう1つのヒントは、カレントディレクトリを別のドライブに設定することです。最初に%~d0、次にcd %~dp0とします。これでディレクトリがバッチファイルのドライブに変更され、次にそのフォルダに変更されます。

あるいは、#oneLinerLoversの場合、@ Omniがコメントで指摘したようにcd /d %~dp0はドライブとディレクトリの両方を変更します。

これが誰かに役立つことを願っています。

33

Strawberry Perlの移植性のあるシェルランチャーの好例です。

set drive=%~dp0
set drivep=%drive%
if #%drive:~-1%# == #\# set drivep=%drive:~0,-1%

set PATH=%drivep%\Perl\site\bin;%drivep%\Perl\bin;%drivep%\c\bin;%PATH%

負の1が自分自身で何をしているのかわからないが、それは御馳走に働く!

21
HansBKK

例はいいでしょう - これは簡単なものです

for %I in (*.*) do @echo %~xI

現在のフォルダ内の各ファイルの拡張子のみを一覧表示します。

cMDプロンプトからのより有用な変数の組み合わせ(前の応答にもリストされています)を実行するには、このスニペットを含むHELP FORを実行します。

修飾子を組み合わせて複合的な結果を得ることができます。

%~dpI       - expands %I to a drive letter and path only
%~nxI       - expands %I to a file name and extension only
%~fsI       - expands %I to a full path name with short names only
%~dp$PATH:I - searches the directories listed in the PATH
               environment variable for %I and expands to the
               drive letter and path of the first one found.
%~ftzaI     - expands %I to a DIR like output line
12
admin