ディレクトリ内にバッチファイルがあり、このディレクトリ内のファイルを更新するため、そこからも実行する必要があります。
ユーザーが管理者としてバッチ ファイルを実行する場合を除いて、これは問題なく機能します (Vista で必要)。その場合、開始ディレクトリは C:\Windows\System32 です。
バッチ ファイルがどのディレクトリから実行されたかを知る方法はありますか?
ユーザーがディレクトリを手動で入力する必要はありません。
8 に答える
次のようにバッチ ファイル パスにアクセスしてみてください。
echo %~dp0
詳細についてはfor /?、上記のコマンドがどのように機能するかを説明するコマンドからの次の引用を参照してください。
次のオプションの構文を使用できるようになりました。
%~I - %I を展開し、周囲の引用符 (") を削除します
%~fI - %I を完全修飾パス名に展開します
%~dI - %I をドライブ文字のみに展開します
%~pI - %I をパスのみに展開します
%~nI - %I をファイル名のみに展開します
%~xI - %I をファイル拡張子のみに展開します
%~sI - 展開されたパスには短い名前のみが含まれます
%~aI - %I をファイルのファイル属性に展開します
%~tI - %I をファイルの日付/時刻に展開します
%~zI - %I をファイルのサイズに展開します
%~$PATH:I - PATH にリストされているディレクトリを検索します
環境変数を展開し、%I を
最初に見つかったものの完全修飾名。
環境変数名が異なる場合
定義されているか、ファイルが見つからない
検索すると、この修飾子は
空の文字列
修飾子を組み合わせて、複合結果を得ることができます。
%~dpI - %I をドライブ文字とパスのみに展開します
%~nxI - %I をファイル名と拡張子のみに展開します
%~fsI - %I を短縮名のみのフルパス名に展開します
%~dp$PATH:I - PATH にリストされているディレクトリを検索します
%I の環境変数であり、
最初に見つかったもののドライブ文字とパス。
%~ftzaI - %I を出力行のような DIR に展開します
それよりもcd良いpushd
- から開始する場合はドライブ文字を変更します
D:\... - UNC ネットワーク パス上にある場合はドライブ文字を割り当てる
それでpushd %~dp0いいです。
良い習慣は、完了したら呼び出すpopdことです。
私が使う:
CD %0..
バッチ ファイルの先頭で、ディレクトリをバッチ ファイルが開始されたディレクトリに変更します。
-マシュー
親を追加することにより、ファイル名から直接 CD を作成できます (Windows 8.x ではテストされていませんが、私が覚えている限り、「永遠に」機能しています)。
CD %FILENAME%\..
また、CD も /D を使用してドライブを変更します。これは上記に示されていますが、明示的に言及されていないため、見逃される可能性があります。CD /D %ファイル名%\..
(FOR /? IF /? SET /? CALL /? GOTO /? はすべて、cmd.exe を使用する場合に非常に有用な読み取りを提供します。私は時々それらを読み直します。)
ここでの実用的なソリューション:
http://www.vistax64.com/vista-general/79849-run-administrator-changes-default-directory.html
FOR /F %%I IN ("%0") DO SET BATDIR=%%~dpI
ECHO バッチ ファイルはディレクトリ %BATDIR% にあります