現在のバッチファイルディレクトリを取得する


283

まず、このトピックを見ましたが、理解できませんでした。

質問 :

D:\path\to\file.bat次の内容のバッチファイルがあります。

echo %cd%
pause

出力は:

C:\

それは違いない D:\path\to

何が悪いのですか?


7
質問に対するすべての回答、特に承認されたものだけでなく、投票数の多いゲッターを読む必要があります。あなたの投稿されたリンクで最高のスコアを持つ答えはあなたの質問にすでに答えています。
dbenham 2013年

4
c:\にいる場合、バッチファイル名を入力すると、c:\が%cd%によって印刷されます。
foxidrive 2013年

回答:


496

システムの読み取り専用変数%CD%は、バッチファイルの場所ではなく、バッチの呼び出し元のパスを保持します。

ユーザーが%0(などscripts\mybatch.bat)を使用して入力したバッチスクリプト自体の名前を取得できます。パラメータの拡張機能は、このように適用することができ%~dp0、バッチスクリプト(例えばにドライブとパスを返しますW:\scripts\)および%~f0フルパス名(例を返しますW:\scripts\mybatch.cmd)。

次の構文を使用すると、バッチスクリプトと同じフォルダー内の他のファイルを参照できます。

CALL %0\..\SecondBatch.cmd

これは、サブルーチンで使用することもできEcho %0、呼び出しラベルecho "%~nx0"を提供しますが、バッチスクリプトのファイル名を提供します。

ときに%0変数が展開され、その結果が引用符で囲まれています。

バッチパラメータの詳細


1
ルックは、私が実行する必要はありませんstm.sqlD:\Dir1\Dir2\stm.sqlmysql.exe -u root -p mysql < %cd%\stm.sqlそのstm.sqlコマンドを実行する必要があり ます。
Hamed Kamrava 2013年

@HamedKamravaは私のSQLバッチ用ですか?*.batまたはのようなバッチファイルではありませんか*.sh
Stoleg

@ Stoleg-実際、D:\Dir1\Dir2\batchfile.batおよびには2つのファイルがありD:\Dir1\Dir2\stm.sqlます。batchfile.batの内容は:でmysql.exe -u root -p mysql < D:\Dir1\Dir2\stm.sqlあり、stm.sqlの内容はいくつかのMySQLコマンドです。
Hamed Kamrava 2013年

1
システム読み取り専用変数%CD%は、バッチファイルの場所ではなく、バッチの呼び出し元のパスを保持します。
Stoleg 2013年

34
echo %~dp0バッチの場所へのパスを返します。echo %~f0ファイル名を持つバッチへのパスを返します。
Stoleg 2013年

119

非常にシンプル:

setlocal
cd /d %~dp0
File.exe

9
コードは短いですが、理解するのは簡単ではありません。このFile.exeとは何ですか?現在のディレクトリパスは%〜dp0に保存されていますか?
イバイロバルダロフ2017

この答えは実際に質問に答えると思います。称賛。
macetw 2017年

3
cd /d %~dp0はバッチファイルの最初の行として使用し、作業をしました
mkb

なぜsetlocalが必要なのですか?それなしでも上手く戻りますか?
T.Todua

1
@ T.Todua "setlocal"は、バッチファイルが終了するか、 "endlocal"が検出されるまで、現在のディレクトリを含む環境の変更を引き起こします。環境変数または現在のディレクトリを変更する場合は、それが適切な形式です。
ジェイミー

30

.batファイル内:

set mypath=%cd%

これで、変数%mypath%を使用してファイルへのファイルパスを参照.batできます。パスが正しいことを確認するには:

@echo %mypath%

たとえばDIR.bat、次の内容で呼び出されたファイル

set mypath=%cd%
@echo %mypath%
Pause

ディレクトリから実行するg:\test\batと、DOSコマンドウィンドウにそのパスがエコーされます。


1
これが最も優れた最も簡単な解決策です
Nani

7
別のパスにある別のファイルから呼び出されているバッチスクリプトが考慮されないため、これは適切なソリューションではありません。
theQuestionMan 2018年

また、昇格したアクセス許可として実行すると、%cd%はC:\ Windows \ system32を返しますが、それが格納されているディレクトリは返しません。
PravyNandas

9

これは、すべてのバッチファイルの先頭で使用するものです。テンプレートフォルダーからコピー/貼り付けするだけです。

@echo off
:: --HAS ENDING BACKSLASH
set batdir=%~dp0
:: --MISSING ENDING BACKSLASH
:: set batdir=%CD%
pushd "%batdir%"

現在のバッチファイルのパスを%batdir%に設定すると、このバッチファイルの変更先に関係なく、現在のバッチファイルの後続のstmtでそれを呼び出すことができます。PUSHDを使用すると、POPDを使用して、このバッチファイルのパスを元の%batdir%にすばやく設定できます。%batdir%ExtraDirまたは%batdir%\ ExtraDir(上記で使用したバージョンに応じて、バックスラッシュで終了するかどうか)を使用する場合、パスにスペースがある場合(たとえば、「%batdir%ExtraDir」)、文字列全体を二重引用符で囲む必要があります。 )。常にPUSHD%〜dp0を使用できます。[https:// ss64.com/ nt / syntax-args .html]には(%〜)パラメータの詳細があります。

行の先頭に(::)を使用すると、コメント行になります。さらに重要なことに、::を使用すると、リダイレクタ、パイプ、特殊文字(<> |など)をコメントに含めることができます。

:: ORIG STMT WAS: dir *.* | find /v "1917" > outfile.txt

もちろん、Powershellはこれだけでなく、他にも多くのことを行います。


2
すばらしい回答です。ありがとうございました!:-) 2番目のテクニック(set batdir=%CD%)に注意してください。これは発信者へのパスであり、batファイル自体ではないため、問題です。実行中のbatファイルへのパスを取得する唯一の有効な方法は、%~dp0です。
ミッチマクメイバーズ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.