わすれなぐさ

自称情報ブログ・備忘録

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

バッチファイルを削除しても処理を続けるにはどうすればいいのでしょうか?

アンパサンド(&)で処理を繋ぐ

アンパサンドを使えば複数のコマンドをまとめて実行できるので、ファイルを削除しても問題ありません。
@echo off & echo ここでファイルを削除する & pause & echo ここも実行できる & pause

実行結果:
ここでファイルを削除する
続行するには何かキーを押してください . . .
ここも実行できる
続行するには何かキーを押してください . . .

さらにキャレット(^)で改行する

アンパサンドで繋ぐ処理が多くなると1行の長さがとんでもないことになるので、何か方法はないか調べたところ、キャレットを使えば任意の場所で改行できるようです。
@echo off &^
echo ここでファイルを削除する &^
pause &^
echo ここも実行できる &^
pause

実行結果は上と同じです。

関連


参考


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

コマンド

バッチファイルの最初に次のコマンドを記述します。
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 の書き方:

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

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

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

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

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

変数名は何でもいいですが、一文字しか使えません。ディレクトリ内に複数のファイルがあるときは、それぞれのファイル名に対して順番に処理が実行されます。

ディレクトリ内のテキストファイル名を取得して一覧を表示する

カレントディレクトリ内のテキストファイルの名前を取得してファイル名一覧を表示するコマンドは次の通りです。
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

このように書くと、%%i には絶対パス付きのファイル名が格納されます。サブディレクトリは検索されません。

参考

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

このページのトップヘ