わすれなぐさ

自称情報ブログ・備忘録

間違いの指摘や役に立ちそうな情報など、些細な事でも気軽にコメントしてください。ブログ管理人へ直接連絡したいときは右下のフォームをご利用ください。

バッチファイルを右クリック→「管理者として実行」を選べば管理者として実行できますが、たまに間違ってダブルクリックするとやり直しになるのが面倒なので、バッチファイルをダブルクリックするだけで自動的に管理者として実行できるようにします。

コマンド

バッチファイルの最初に次のコマンドを記述します。
openfiles > nul
if errorlevel 1 (
    PowerShell.exe -Command Start-Process \"%~f0\" -Verb runas
    exit /b
)

こうすることで、管理者権限なしでバッチファイルが実行されたときには UAC ダイアログが表示され、「はい」を押すと、新しいウィンドウで管理者としてバッチファイルが実行されます。

解説

まず管理者権限の有無を確認する裏技として openfiles を利用します。openfiles は、管理者権限がないと errorlevel に 1 を返します。

バッチファイルを管理者として実行するために、次の PowerShell コマンドを利用します。%~f0 はバッチファイル自身のフルパスです。
Start-Process "%~f0" -Verb runas

PowerShell コマンドをコマンドプロンプト上で実行するには次のようにします。
PowerShell.exe -Command <コマンド>

このとき <コマンド> 内のダブルクオーテーションをエスケープする必要があるので、結局、次のようになります。
PowerShell.exe -Command Start-Process \"%~f0\" -Verb runas

ちなみに、次のような書き方もあります。
PowerShell.exe -Command "<コマンド>"
PowerShell.exe -Command "& {<コマンド>}"

一応これも動くようです。
PowerShell.exe <コマンド>

参考

管理者権限で起動する方法:
PowerShell.exe -Command の書き方:

バッチファイルで、ディレクトリ内のファイル名を取得して変数に格納する方法です。

ファイル名を変数に格納して何らかの処理を実行するには、for コマンドを使います。

ディレクトリ内のすべてのファイル名を取得する

カレントディレクトリ内のすべてのファイル名を取得するには、次のようにします。
for %%i in (*) do (
    処理
)

簡単な処理なら一行で書くことも可能です。
for %%i in (*) do 処理

変数名はここでは「i」としていますが他の文字でも構いません。ただし、変数名には1文字しか使えません。

カレントディレクトリ内に複数のファイルがあるときは、それぞれのファイル名に対して順番に処理が実行されます。サブディレクトは検索されません。サブディレクトリを含めるには for /r とします。

ファイル名ではなくディレクトリ名を取得したい場合は、for /d とします。

[例] ディレクトリ内のテキストファイルの名前を取得して一覧を表示する
カレントディレクトリ内のテキストファイルの名前を取得して一覧を表示するには、次のように書きます。
for %%i in (*.txt) do echo %%i

このバッチファイルを実行すると、コマンドプロンプト上では例えば次のように表示されます。
C:\hogehoge>for %i in (*.txt) do echo %i

C:\hogehoge>echo temp1.txt
temp1.txt

C:\hogehoge>echo temp2.txt
temp2.txt

コマンドプロンプト上では「%」が1個だけになります。

カレントじゃないディレクトリを検索する

任意のディレクトリ内のファイル名を取得するには、次のようにします。
for %%i in (C:\hogehoge\*) do echo %%i

このように書くと、絶対パス付きのファイル名が変数に格納されます。

参考

サブディレクトリの検索などは2つめのリンクを、for の他の使い方などについては3つめのリンクをご覧ください。

自爆するバッチファイルの作り方です。自分自身のパスの書き方についても解説しています。

コマンド

自分を消すコマンドは次の通りです。
del "%~f0"

場合によっては次のほうが簡単に書けます。
del %0

この2つの違いは次で説明します。

自分自身を表す変数について

自分自身を表す変数(?)は次のようになっています。

変数 説明
%0 バッチファイル実行時に指定された形† "C:\foo\bar\test.bat" など
%~0 バッチファイル実行時に指定された形†(引用符なし) C:\foo\bar\test.bat など
%~f0 フルパス C:\foo\bar\test.bat
%~d0 ドライブ C:
%~p0 パス \foo\bar\
%~n0 ファイル名 test
%~x0 拡張子 .bat

†:ダブルクリックで実行したときは、ダブルクオーテーション付きのフルパスになります。別のバッチファイルやコマンドラインから実行した場合は、実行時に指定した形になります。

文字を組み合わせて使うこともできます。例えば、%~nx0 で拡張子付きのファイル名を表せます。%~dpnx0 で %~f0 と同じ意味になります。

この変数の使い方は call 文のヘルプで説明されています。以下、call /? の実行結果から一部引用。
また、バッチ スクリプトの引数参照 (%0、%1 など) の展開は、次のように
変更されました:


    %* バッチ スクリプト内では、すべての引数 (%1、%2、%3、%4、
        %5 など) を参照します。

    バッチ パラメーター (%n) の置換は拡張されました。次のオプション構文
    を使うことができます:

        %~1         - すべての引用句 (") を削除して、%1 を展開します。
        %~f1        - %1 を完全修飾パス名に展開します。
        %~d1        - %1 をドライブ文字だけに展開します。
        %~p1        - %1 をパスだけに展開します。
        %~n1        - %1 をファイル名だけに展開します。
        %~x1        - %1 をファイル拡張子だけに展開します。
        %~s1        - 展開されたパスは、短い名前だけを含みます。
        %~a1        - %1 をファイル属性に展開します。
        %~t1        - %1 をファイルの日付/時刻に展開します。
        %~z1        - %1 をファイルのサイズに展開します。
        %~$PATH:1   - PATH 環境変数に指定されているディレクトリを検索し、
                       最初に見つかった完全修飾名に %1 を展開します。
                       環境変数名が定義されていない場合、または
                       検索してもファイルが見つからなかった場合は、
                       この修飾子を指定すると空の文字列に展開されます。

    修飾子を組み合わせて、複合結果を得ることもできます:

        %~dp1       - %1 をドライブ文字とパスだけに展開します。
        %~nx1       - %1 をファイル名と拡張子だけに展開します。
        %~dp$PATH:1 - PATH 環境変数に指定されているディレクトリを
                       検索して %1 を探し、最初に見つかったファイル
                       のドライブ文字とパスだけに展開します。
        %~ftza1     - %1 を DIR の出力行のように展開します。

    上の例の %1 と PATH は、他の有効な値で置き換えることができ
    ます。%~ 構文は有効な引数の数によって区切られます。%~ 修飾子
    は %* と同時には使用できません。


参考



一言

「バッチファイル 自分 削除」と検索すると、コマンド自体は見つけられるのだが、肝腎の説明が載っていないので困っていた。しかし「バッチファイル 自分自身」と検索すれば、ちゃんと変数の意味が説明されているウェブページを発見することができた。こういうのが「ググる力」なのだなと再実感した。

このページのトップヘ