web-dev-qa-db-ja.com

バッチファイルの現在のディレクトリを見つけて、パスに使用するにはどうすればよいですか?

ソフトウェアタスクを実行するために顧客に配布する予定のバッチファイルがあります。

それらをフォルダーまたは.Zipとして配布し、その中にファイルを入れます。内部には、バッチファイルと、バッチの実行に必要なファイルを含む別のフォルダーがあります。

通常、バッチを作成するときは、ファイルのあるパスを入力します。しかし、ファイルの場所はわかりません。ファイルは引き続きマスターフォルダー内に保持されますが、ファイルを実行するためにバッチでそのフォルダーを見つける必要があります。

たとえば、デスクトップにマスターフォルダーがあり、それを実行する場合、実行するには"C:\Users\Username\Desktop"のようなものである必要があります。その場所にバッチCDがあります。

しかし、ドキュメントから実行した場合はどうなりますか?ユーザー名がわからないので、どうにかしてバッチでこれを見つけなければなりません。どんなコードや指示も素晴らしいでしょう。

67
Ryan Barber

ファイルの場所を知る必要はありません。batファイルを起動するとき、作業ディレクトリは起動されたディレクトリ(「マスターフォルダ」)であるため、この構造を持っている場合:

.\mydocuments\folder\mybat.bat
.\mydocuments\folder\subfolder\file.txt

ユーザーが「mybat.bat」を起動すると、作業ディレクトリは「。\ mydocuments\folder」になるため、スクリプトにサブフォルダー名を記述するだけで済みます。

@Echo OFF
REM Do anything with ".\Subfolder\File1.txt"
PUSHD ".\Subfolder"
Type "File1.txt"
Pause&Exit

とにかく、作業ディレクトリは「%CD%」変数に格納され、バットが起動されたディレクトリは引数0に格納されます。

@Echo OFF
Echo Launch dir: "%~dp0"
Echo Current dir: "%CD%"
Pause&Exit
85
ElektroStudios

ElektroStudiosの答えは少し誤解を招きます。

「batファイルを起動するとき、作業ディレクトリはそれが起動されたディレクトリです」これは、ユーザーがエクスプローラでバッチファイルをクリックした場合に当てはまります。

ただし、CALLコマンドを使用して別のスクリプトからスクリプトが呼び出された場合、現在の作業ディレクトリは変更されません。

したがって、スクリプト内では、%〜dp0subfolder\file1.txtを使用することをお勧めします

また、現在のスクリプトが現在の作業ディレクトリにない場合、%〜dp0はバックスラッシュで終了することに注意してください。したがって、バックスラッシュなしのディレクトリ名が必要な場合は、次のようなものを使用できます。

call :GET_THIS_DIR
echo I am here: %THIS_DIR%
goto :EOF

:GET_THIS_DIR
pushd %~dp0
set THIS_DIR=%CD%
popd
goto :EOF
55
Henning

あなたもできる

 Pushd "%~dp0"

また、UNCパスからの実行も考慮されます。

44
Matt Williamson

あなたのバッチで試してください

set "batchisin=%~dp0"

バッチの場所に変数を設定する必要があります。

6
Magoo