%〜dp0は何を意味し、どのように機能しますか?


1024

私は%~dp0非常に便利で、バッチファイルの移植性を高めるために多く使用しています。

しかし、ラベル自体は私には非常に謎めいているようです...何をし~ていますか?いdp平均ドライブとパス?ん0を参照して%0、ファイル名を含んでバッチファイルへのパスを?

それとも変なレーベルですか?

また、それが文書化された機能なのか、それとも非推奨になる傾向があるのか​​を知りたいです。



2
あなたは正しい、ヘレン。%〜dp0を検索しても、その質問は表示されませんでした。おそらく、タイトルに%〜dp0ではなく%〜d0が含まれているためです。
セバスティアンGrignoli

9
SymbolHoundは、英数字以外の文字の検索に最適です。たとえば、を検索し%~dp0ます。通常、上位のヒットはSOのコンテンツを参照していることがわかります。
DavidRR 2015

SymbolHoundは、symbolhound.com /?q =%25〜dp0の検索では機能しませんでした。ただし、これは機能しました:google.com/search ?q=%25~dp0-just sayin '...
Kristopher

1
SymbolHound 2019:機能せず、uMatrixはblockchain.infoやpaypalobjects.comなどのサードパーティサイトに接続することを示しています。
Nils Lindemann

回答:


811

呼び出す

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は想定したとおりのバッチファイルの完全な名前です)。


2
他の人については知りませんが、「バッチパラメータ置換でのパス演算子の次の使用は無効です。有効な形式の場合、CALL /?またはFOR /?と入力してください。コマンドの構文は正しくありません。」と表示されます。使用するときI。の0代わりに使用する必要がありIます。私は何かを逃したかどうかはわかりませんが、人々に知らせています。
mythofechelon

71
@BenHooper Iは、変数インデックスのプレースホルダーです。0=呼び出しファイル、1=引数#1、2=引数#2など...
Chris

9
この答えはいいです。そして網羅的。もう少し簡潔にするために、Iこのニア重複質問への答えのように:stackoverflow.com/questions/112055/...
フランクNocke

1
これらの置換はFORの外部で使用できるため、この回答は少し混乱します。
David

348

(最初に、この有用な参照サイトをバッチに推奨したいと思います:http : //ss64.com/nt/

次に、もう1つの便利な説明を示します。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の記事をご覧ください。

また、このフォーラムスレッドもご覧ください

そして、ここからのより明確な参照:

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

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

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

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

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

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

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

追加1

不思議な ~チルド演算子の良い参考文献を見つけました。

%~文字列が呼び出されチルダパーセント演算子。次のような状況で見つけることができます%~0

:~文字列が呼び出されチルダコロン演算子。あなたはそれを次のように見つけることができます%SOME_VAR:~0,-1%

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

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

また、この概念に興味があり、ここでわかりやすく説明しました。Minggeに感謝します。^ _ ^
ユージーン

1
私にとっては、c:\ bat_files \に展開されます(後続のパスセパレーター付き)
サンタ

Microsoftの記事とフォーラムスレッドへのリンクが機能しなくなった:(
wovano

151

%0バッチスクリプトの変数は、実行中のバッチファイルの名前に設定されます。

との~dp間の特別な構文では%0基本的に変数を展開し%0てドライブ文字とパスを表示し、バッチファイルを含む現在のディレクトリを表示します。

ヘルプ= リンク


@Andy、%0ローカルハードドライブに.batファイルを保存せずにcmdで直接テストする方法はありますか?
Pacerier、2015

リンクが壊れており、正しいリンクを見つけることができません。保留中の編集には、壊れたリンクが残っています。
George_E

44

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

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

C:\ script \ test.bat

内容:

@echo off
echo %~dp0

コマンドプロンプトから実行すると、次の結果が表示されます。

C:\ script \


41

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

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

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


23
cdドライブやフォルダの両方を切り替えますそのパラメータが組み込まれています:cd /d %~dp0
OmnipotentEntity

2
あなたは正しいですし、/d議論は役に立ちますが、これは代替回答の候補として投稿され、この回答に対するコメントではありません。これを指摘してくれてありがとう、私はそれについて知りませんでした:)
Marvin Thobejane

4
'' pushd%〜dp0 ''を使用してドライブとフォルダーを切り替えることもできます
fmuecke

25

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が何をしているのかわからないが、それはごちそうだ!


11
+1は非常に便利です。ifステートメントは、バックスラッシュが存在するかどうかをチェックし、必要に応じてバックスラッシュを削除します。条件の負の1は最後の文字を抽出し、setステートメントの式はパス文字列から最後の文字(バックスラッシュ)を引いたものになります。
マット

1
負の1は最後の文字を引いたものです。可変部分文字列の
phuclv '11年

12

例はいいでしょう-ここに簡単なものがあります

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

「〜x私は現時点では予期せぬものでした。」例を試す-それは私がWin 7を使用しているためですか?
チャプター3 2018

これは良い情報ですが、元の投稿には対応できません。
De Shan Baptiste
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.