Windowsでバッチスクリプトのパスを取得する方法


329

私はそれ%0がバッチスクリプトの完全なパスを含んでいることを知っています、例えばc:\path\to\my\file\abc.bat

path等しいだろうc:\path\to\my\file

どうすればそれを達成できますか?




1
ところで、相対コマンドラインでバットが呼び出された場合、%0にはフルパスが含まれません。したがって、この場合は "%〜dpf0"の方が信頼性が高くなります。
eckes

回答:


563

%~dp0ディレクトリになります。ここにすべてのパス修飾子に関するドキュメントがあります。楽しいもの:-)

最後のバックスラッシュを削除するには:n,m、次のように部分文字列構文を使用できます。

SET mypath=%~dp0
echo %mypath:~0,-1%

残念ながら、%0構文と構文を組み合わせる方法はないと思います:~n,m


7
すばらしい...私はこれまで使用してきました%~0\..-より良い方法がなければならないことを知っていました!また、あなたはおそらく囲むことになるでしょう%~dp0、二重引用符(に"")場合になど、ディレクトリ名にスペースがあります
キャメロン

1
いいね!ただし、%~dp0最後に「」が含まれています。あなたはそれを削除する方法を考えていますか?
Misha Moroshko

1
@Misha:末尾の「\」を削除する方法を意味すると思います。回答を詳細に更新しました。
ディーンハーディング

2
回答の例は、パスにスペースが含まれている場合でも、引用符なしで問題なく機能します。(たとえば、SET msg=hello world正常に動作します)。ただし、他の場所で%mypath%を使用する場合は、引用符でそれを使用するように注意する必要がありますが、cdどちらにも必要ありません。
Martin Pain

2
そのリンクは現在404です
StingyJack

12

次のスクリプトを使用して、「\」を付けずにパスを取得できます

for %%i in ("%~dp0.") do SET "mypath=%%~fi"

ただし、これはパスからファイル名を削除しません(たとえば、OPの例ではabc.txt)。
dcp

4
@dcpええ、それはそうです。
カイルストランド

@カイルストランド-ええ、私はもう一度試してみましたが、今はうまくいきます。最初に試したときに何が起こったのかわかりません。スクリプトのどこかで間違いを犯したのかもしれません。混乱して申し訳ありません。指摘していただきありがとうございます。
dcp、2016

11

%~dp0相対パスの場合があります。それをフルパスに変換するには、次のようなことを試してください:

pushd %~dp0
set script_dir=%CD%
popd

6
では、%~dp0直接使用しないのはなぜですか?
jpaugh 2016年

5
5年後に投稿された、受け入れられた回答のより悪いバージョン?分かりません。
カイルストランド

これは、受け入れられた回答のコメントで言及されている問題に対処するために投稿されたと思います- %~dp0相対的である可能性があり、ユースケースに応じて問題となる場合と問題にならない場合があります
Michael Mrozek

10
%~dp0相対パスを含めることはできません。dドライブとパスを表します。ドライブをpどのように相対パスにすることができますか?
2017年

5
どの世界で?Windows Server 2012 r2でこの回答をテストした%~dp0ところ、スクリプトが相対パスとして実行された場合でも、絶対パスになります。jebのコメントのおかげで、私はこの答えにだまされませんでした。なぜ人々は単にものを作り、行き、彼らの野生の想像力を他の人に広げ始めますか?私にはこれを行う同僚がいますが、私は彼の(若い)年齢を非難しました。私の反対票が数えられることを望みます。
bitoolean

0

を使用できます%~dp0。dはドライブのみを意味し、pはパスのみを意味し、0はバッチファイルの完全なファイル名の引数です。

たとえば、ファイルパスがC:\ Users \ Oliver \ Desktop \ example.batの場合、引数はC:\ Users \ Oliver \ Desktop \と等しくset cpath=%~dp0 && set cpath=%cpath:~0,-1%なり、コマンドを使用して%cpath%変数を使用して末尾のスラッシュを削除することもできます。


1
9歳の回答よりも多くの情報を見ることができません
jeb

追加情報は、「dはドライブのみを意味する…」などです。@ Hayz、ありがとうございます。
RJ Dunnill

-2

%cd% スクリプトが実行されているディレクトリのパスが表示されます。

とにかく走れ:

echo %cd%

%CD%バッチファイルが保存されているフォルダーではなく、現在の作業フォルダーです。同じ場所にすることもできますが、多くの場合は同じではありません。
ステファン

-7

それが%CD%変数になります。

@echo off
echo %CD%

%CD% バッチスクリプトがある現在のディレクトリを返します。


35
%でcd%がスクリプトではなく、ディレクトリから実行されたディレクトリを返すスクリプトがである。
ミーシャMoroshko

4
スクリプトが作業ディレクトリを変更しない場合にのみ機能します。試してみてくださいCD C:\Temp <CR> ECHO %CD%<CR>is newline ...)
Dean Harding

6
また、スクリプトを右クリックして[管理者として実行]を選択すると、スクリプトの場所に関係なく、現在のディレクトリはC:\ Windows \ System32になります。
Cameron

OPの質問に対する直接の回答ではありませんが、この機能のフレーバーは、この質問を見つけたときに私が探していたものとまったく同じです。ありがとう!
ゾルタン2014年

投稿された他の解決策はいずれも、Win7 32ビットcmd.exeでは機能しないようです。これは少なくとも私にとっては役に立ちます。
クリフォード、

-8

私はWindows 7マシンで作業しており、bashスクリプトの絶対フォルダーパスを取得するために以下の行を使用することになりました。

http://www.linuxjournal.com/content/bash-parameter-expansionを見て、このソリューションにたどり着きました。

#Get the full aboslute filename.
filename=$0
#Remove everything after \. An extra \ seems to be necessary to escape something...
folder="${filename%\\*}"
#Echo...
echo $filename
echo $folder

2
OPは、bashではなくWindows BAT / CMDシェルスクリプトについて尋ねています。
2016年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.