DOSのバッチ処理における%cd%と%~dp0の違いについて説明します。
問題の説明
バッチa.batでバッチの実行を呼び出すとすると
b.bat
は、その
b.bat
知る必要がある
b.bat
を現在の場所で実行し
run.exe
を以下のように設定します。
// directory structure
// c:
// -a.bat
// -program
// -b.bat
// -run.exe
// a.bat
call "%cd%\program\b.bat"
// b.bat
"%cd%\run.exe"
さて、これでうまく実行できるでしょうか?
run.exe
?
問題分析
%cd%
と
%~dp0
はどちらもカレントディレクトリを表すのに使えますが、異なる使用シナリオで異なる機能を果たします。
-
%cd%
は現在の作業ディレクトリを表します(変数)。 -
%~dp0
は、バッチファイルのディレクトリがあるフルディレクトリを表します(固定)。
次の例を見てみましょう。
// directory structure
// c:
// -c.bat
// -program
// -d.bat
// c.bat
call "%cd%\program\d.bat"
// d.bat
@echo off
echo cd = %cd%
echo dp0 = %~dp0
直接実行する
d.bat
となり、その結果は
cd = C:\program
dp0 = C:\program\
直接実行する
c.bat
となり、その結果は
cd = C:\
dp0 = C:\program\
上の結果からわかるように
-
の実行
d.bat
現在の作業ディレクトリがd.bat
ディレクトリを作成します。 -
実行する
c.bat
現在の作業ディレクトリがc.bat
を呼び出してもd.bat
を指定すると、作業ディレクトリはc.bat
ディレクトリを作成します。
問題解決
問題の説明で述べた問題に戻りましょう - うまく実行できるかどうか
run.exe
?
答えは、「できない」です "。
%cd%\run.exe
は "で示されます。
C:\run.exe
はなく、"です。
C:\program\run.exe
"です。では、どうすれば変更できるのでしょうか?
2つの選択肢があります。
// plan A
// change the current working directory
// a.bat
cd "%~dp0"
call "%cd%\program\b.bat"
// b.bat
cd "%~dp0"
"%cd%\run.exe"
// plan B
// using %~dp0 directly
// a.bat
call "%~dp0program\b.bat"
// b.bat
"%~dp0run.exe"
質問の拡張子
上記の解決策では、A案はカレントディレクトリを変更することで問題を解決していますが、ここにも問題があるので、次の例を見てみましょう。
// directory structure
// c:
// -program
// -f.bat
// d:
// -e.bat
// plan A
// change the current working directory
// e.bat
cd "%~dp0"
call "c:\program\f.bat"
// f.bat
cd "%~dp0"
"%cd%\run.exe"
現在
e.bat
と
f.bat
が同じドライブにない場合は
e.bat
現在の作業ディレクトリを切り替えて
f.bat
cdを直接使ってもうまくいかないので、:
cd /d "%~dp0"
ここは見落としがちなところなので、間違えないように覚えておきましょう。
問題の概要
再掲載
%~dp0
と
%cd%
の違いは
%cd%
と
%~dp0
はどちらもカレントディレクトリを表すのに使えますが、異なる使用シナリオで異なる機能を果たします。
-
%cd%
は現在の作業ディレクトリを表します(変数)。 -
%~dp0
は、バッチファイルのディレクトリを表します(固定)。
現在の使い方からすると
%~dp0
を使用することはお勧めしません。
%cd%
特に必要な場合を除き
概要
この記事の内容が、あなたの勉強や仕事に役立てば幸いです。また、何か質問があれば、コメントを残してください。
関連
-
万年暦(旧暦含む)の一括実装コード
-
ウィンドウは、git update (git pull) を定期的に実行するタスクスケジュールを設定し、実行中の cmd を非表示にします。
-
cmdコマンドのリダイレクト出力 2>&1 解説
-
DOSリダイレクトコマンドの使い方とセキュリティへの応用
-
DOSバッチ処理では、カレントディレクトリのソリューションとしてUNCパスをサポートしていません。
-
バッチプロセスでポート135、137、445などを閉じる実装コード(ランサムウェア)
-
batコマンドのバッチプロセスは、32ビットまたは64ビットシステムかどうかを判断するために、さまざまな方法
-
DOS(バット)文字列置換の原理
-
mavenコマンドのBATスクリプトを呼び出して共有する
-
DOSバッチコマンド For loopコマンド詳細説明
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
WindowsでのMysql sqlステートメントのバッチ実行
-
バッチ処理における文字列分割コード
-
CMDコマンドラインパイプラインコマンドの紹介
-
bat は set /a 計算後の日付と時刻をインターセプトします、08 と 09 は不正な 8 進数として扱われます
-
指定されたディレクトリからファイル名を一括で抽出します。
-
set /p=コマンドを詳しく説明します。
-
dosコマンドラインでIEプロキシを設定するコード
-
N日前または指定日時(前後)に作成(または変更)されたファイルをバッチ処理で削除する。
-
Dosバッチ書き込みワンクリッククリーンシステムジャンクbatコード
-
dosコマンドでWindowsのスケジュールタスクをインポート/エクスポート