コマンドライン.cmd / .batスクリプト、実行中のスクリプトのディレクトリを取得する方法


回答:


58

RaymondChenにはいくつかのアイデアがあります。

https://devblogs.microsoft.com/oldnewthing/20050128-00/?p=36573

MSDNアーカイブは信頼性が低い傾向があるため、ここで完全に引用します。

簡単な方法は、%CD%疑似変数を使用することです。現在の作業ディレクトリに展開されます。

set OLDDIR=%CD%
.. do stuff ..
chdir /d %OLDDIR% &rem restore current directory

(もちろん、保存/復元ディレクトリがより簡単で行われている可能性pushd/popdが、それはここでのポイントはありません。)

この%CD%トリックは、コマンドラインからでも便利です。たとえば、操作したいファイルがあるディレクトリにいることがよくありますが、その操作を実行するには、他のディレクトリにchdirする必要があります。

set _=%CD%\curfile.txt
cd ... some other directory ...
somecommand args %_% args

(私%_%はスクラッチ環境変数として使用するのが好きです。)

入力SET /?して、コマンドプロセッサによって提供される他の疑似変数を確認します。

また、記事内のコメントは、たとえばこれをスキャンする価値があります(コメントは古い記事から削除されているため、WayBack Machineを介して):

http://blogs.msdn.com/oldnewthing/archive/2005/01/28/362565.aspx#362741

これは%〜dp0の使用をカバーします:

バッチファイルがどこにあるか知りたい場合: %~dp0

%0バッチファイルの名前です。~dp指定された引数のドライブとパスを提供します。


13
これは質問に答えません。%CD%は現在のディレクトリを示し、質問されたのはスクリプトのディレクトリでした。
ケトリン2008年

3
@ketorin:このDOESは、質問に答えます。スクリプト自体は、それの使い方(のpushd / CD / ..)全体のディレクトリを変更する場合は、%CD%が変更されますが、%〜DP0はなりませスクリプトが配置されている場所に変更し、常にポイント。
ジェイ

-1これが質問に答えるかどうかはわかりません。例を教えていただけますか?
Iain Samuel McLean Elder

1
@ IainElder-あなたはおそらく正しいです、私は数日前にこの答えを再訪しました、そしてそれにあまり満足していませんでした。私が言及しているレイモンド・チェンのブログへのコメントは、MSによって批判されたようです。そのため、リンクされた外部ソースに完全に依存する回答の危険性がそこにあります。私は自分の答えを裏付けるために他の資料を見つけようとしましたが、それはずっと昔のことです。削除のフラグを立てます。これで私を端から端まで傾けてくれてありがとう:)あなたはSkyScannerで働いていないのですか?
Kev 2013

1
@Kev役立つ部分をStackOverflowにコピーする場合は、外部ソースを参照してもかまいません。今では手遅れだと思います!はい、私はスカイスキャナーのデータセンターに潜んでいることが知られています;-)
Iain Samuel McLean Elder

147

これは、スクリプトのパスと同等です。

%~dp0

これは、バッチパラメータ拡張構文を使用します。パラメータ0は常にスクリプト自体です。

スクリプトがに保存されているC:\example\script.bat場合、はに%~dp0評価されC:\example\ます。

ss64.comには、パラメーター拡張構文に関する詳細情報があります。関連する抜粋は次のとおりです。

コマンドラインでの%とそれに続く数値位置を使用して、任意のパラメーターの値を取得できます。

[...]

パラメータを使用してファイル名を指定する場合、次の拡張構文を適用できます。

[...]

%〜d1%1をドライブ文字のみに展開します-C:

[...]

%〜p1%1をパスのみに展開します(例:\ utils \)。これには末尾の\が含まれ、一部のコマンドではエスケープ文字として解釈される場合があります。

[...]

上記の修飾子は組み合わせることができます。

%〜dp1%1をドライブ文字とパスのみに展開します

[...]

バッチスクリプト自体のパス名は%0で取得できます。これにパラメータ拡張を適用できるため、%〜dp0はドライブとパスをバッチスクリプトに返します(例:W:\ scripts \)。


まさに私が必要としていたもの。そして、リマインダーとして、この回答をブログにリンクしました:)
Olivier H

引用されたテキストのバグ/エラーかどうかはわかりませんが、私のスクリプトでは、ドライブ文字を取得するために「%〜d0」が必要です。私の場合、%〜d1は空です。
fklappan 2015年

私の目/状況では、これは受け入れられた答えよりも優れています。コマンドラインスクリプトを「管理者として」(右クリックして)実行すると、スクリプトはWindows \ system32から実行されます。受け入れられた答えはあなたにスクリプトの場所を与えません、それはあなたに再びWindows \ system32を与えます。すなわちTHISの答えは、あなたがそれを修正することができます、あなたは、CD%〜DP0でスクリプトを開始
ヤロスラフZáruba

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