web-dev-qa-db-ja.com

「管理者として実行」時のWindowsバッチファイル開始ディレクトリ

ディレクトリにあるバッチファイルがあり、このディレクトリ内のファイルを更新するため、そこからも実行する必要があります。
これは、ユーザーが管理者としてバッチファイルを実行する場合(Vistaでは必須)を除き、完全に正常に機能します。次に、開始ディレクトリはC:\ Windows\System32です。

バッチファイルがどのディレクトリから実行されたかをまだ知る方法はありますか?
ユーザーにディレクトリを手動で入力させたくありません。

69
Marc

次のようなバッチファイルパスにアクセスしてください。

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に展開します
96
Martin

cdpushdよりも優れています。

  • D:\...から開始する場合はドライブ文字を変更します
  • uNCネットワークパス上にある場合、ドライブ文字を割り当てます

pushd %~dp0は良いです。

完了したら、popdを呼び出すことをお勧めします。

42
Benoit

これにより、バッチファイルの作業ディレクトリを現在のディレクトリに戻すことで問題を解決できます。

.batスクリプトの先頭に次の2行を含めます。

@setlocal enableextensions
@cd /d "%~dp0"

で発見: http://www.codeproject.com/Tips/119828/Running-a-bat-file-as-administrator-Correcting-cur

25
NMrt

親を追加することで、ファイル名から直接CDを作成できます(Windows 8.xではテストされていませんが、覚えている限り「永久に」機能します)。

CD %FILENAME%\..

また、CDは/ Dを使用してドライブも変更します。/Dは上記に示されていますが、明示的に言及されていないため、見落とされる可能性があります。 CD/D%FILENAME%\ ..

(FOR /?IF /?SET /?CALL /?GOTO /?はすべて、cmd.exeを使用すると非常に便利な読み取り機能を提供します。

0
Malcolm

私が使う:

cd%0 ..

バッチファイルの先頭で、ディレクトリをバッチファイルが開始されたディレクトリに変更します。

-マシュー

0
Mathew