まず、 このトピック を見ましたが、それを理解できませんでした。
質問:
次の内容のバッチファイルがD:\path\to\file.bat
にあります。
echo %cd%
pause
出力は以下のとおりです。
C:\
D:\path\to
にする必要があります
何がおかしいのですか?
システム読み取り専用変数%CD%
は、バッチファイルの場所ではなく、バッチの呼び出し元のパスを保持します。
%0
を使用してユーザーが入力したバッチスクリプト自体の名前を取得できます(例:scripts\mybatch.bat
)。 パラメータ拡張 をこれに適用することができるので、%~dp0
はDriveとPathをバッチスクリプトに返し(W:\scripts\
)、%~f0
はフルパス名(W:\scripts\mybatch.cmd
)を返します。
この構文を使用して、バッチスクリプトと同じフォルダ内の他のファイルを参照できます。
CALL %0\..\SecondBatch.cmd
これはサブルーチンでも使用でき、Echo %0
は呼び出しラベルを与えますが、echo "%~nx0"
はあなたにバッチスクリプトのファイル名を与えます。
%0
変数が展開されると、結果は引用符で囲まれます。
とても簡単
setlocal
cd /d %~dp0
File.exe
あなたの.batファイルの中で:
set mypath=%cd%
これで、変数%mypath%
を使用して、.bat
ファイルへのファイルパスを参照することができます。パスが正しいことを確認するには
@echo %mypath%
例えば、以下の内容のDIR.bat
というファイル
set mypath=%cd%
@echo %mypath%
Pause
ディレクトリg:\test\bat
から実行すると、DOSコマンドウィンドウにそのパスが表示されます。
これが私のすべてのバッチファイルの一番上で使っているものです。テンプレートフォルダからコピー&ペーストするだけです。
@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はこれに加えてもっと多くのことを行います。