ソフトウェアタスクを実行するために顧客に配布する予定のバッチファイルがあります。
それらをフォルダーまたは.Zip
として配布し、その中にファイルを入れます。内部には、バッチファイルと、バッチの実行に必要なファイルを含む別のフォルダーがあります。
通常、バッチを作成するときは、ファイルのあるパスを入力します。しかし、ファイルの場所はわかりません。ファイルは引き続きマスターフォルダー内に保持されますが、ファイルを実行するためにバッチでそのフォルダーを見つける必要があります。
たとえば、デスクトップにマスターフォルダーがあり、それを実行する場合、実行するには"C:\Users\Username\Desktop"
のようなものである必要があります。その場所にバッチCDがあります。
しかし、ドキュメントから実行した場合はどうなりますか?ユーザー名がわからないので、どうにかしてバッチでこれを見つけなければなりません。どんなコードや指示も素晴らしいでしょう。
ファイルの場所を知る必要はありません。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
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
あなたもできる
Pushd "%~dp0"
また、UNCパスからの実行も考慮されます。
あなたのバッチで試してください
set "batchisin=%~dp0"
バッチの場所に変数を設定する必要があります。