web-dev-qa-db-ja.com

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

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

質問:

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

echo %cd%
pause

出力は以下のとおりです。

C:\

D:\path\toにする必要があります

何がおかしいのですか?

232
Hamed Kamrava

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

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

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

CALL %0\..\SecondBatch.cmd

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

%0変数が展開されると、結果は引用符で囲まれます。

バッチパラメータの詳細

436
Stoleg

とても簡単

setlocal
cd /d %~dp0
File.exe
105
shay

あなたの.batファイルの中で:

set mypath=%cd%

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

@echo %mypath%

例えば、以下の内容のDIR.batというファイル

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

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

24
rockerron

これが私のすべてのバッチファイルの一番上で使っているものです。テンプレートフォルダからコピー&ペーストするだけです。

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

現在のバッチファイルのパスを%batdir%に設定すると、このバッチファイルの変更先に関係なく、現在のバッチファイル内の後続のステートメントで呼び出すことができます。 PUSHDを使用すると、POPDを使用してこのバッチファイルのパスを元の%batdir%にすばやく設定できます。 %batdir%ExtraDirまたは%batdir%\ ExtraDirを使用する場合(上記で使用されているバージョンに応じて、円記号を終了するかどうかにかかわらず)、パスにスペースがある場合はストリング全体を二重引用符で囲む必要があります)あなたはいつでもPUSHD%〜dp0を使うことができます。 [https:// ss64.com/nt/syntax-args .html]にはさらに(%〜)パラメータがあります。

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

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

もちろん、Powershellはこれに加えてもっと多くのことを行います。

1
Wendell Holmes