web-dev-qa-db-ja.com

バッチファイルを削除するにはどうすればいいですか?

バッチファイルに自分自身を削除させることは可能ですか?

私はそれを削除するために別のファイルを実行させようとしましたが、これはうまくいきませんでした。使用しているバッチファイルは昇格しています。私のOSはWindows 7 32ビットです。

36
09stephenb

npocmakaの答えは機能しますが、次のエラーメッセージが生成されます。 "バッチファイルが見つかりません。 「これは、スクリプトが終了したときにコンソールウィンドウが閉じた場合は問題ではありません。メッセージが非常に速く点滅するため、誰にも表示されません。ただし、スクリプトの終了後にコンソールが開いたままになっている場合は、非常に望ましくありません。

エラーメッセージなしでファイルを削除する秘Theは、スクリプトの終了後に別の隠しプロセスを取得してファイルを削除することです。これは、削除プロセスを開始するためにSTART/Bを使用して簡単に実行できます。削除プロセスの開始と実行には時間がかかるため、親スクリプトは削除が行われる前に正常に終了する可能性があります。

start /b "" cmd /c del "%~f0"&exit /b

SHIFTが%0値を破壊することが心配な場合は、単にCALLedサブルーチンを使用できます。

call :deleteSelf&exit /b
:deleteSelf
start /b "" cmd /c del "%~f0"&exit /b

2015-07-16を更新

エラーメッセージを生成せずにバッチスクリプトを自動的に削除する別の非常に巧妙な方法を発見しました。この手法は、英語で http://www.dostips.com/forum/viewtopic.php?f=3&t=6491 で説明されているGOTO(ロシア人によって発見された)の新たに発見された動作に依存します。

要約すると、(GOTO) 2>NULEXIT /Bと同じように動作しますが、呼び出し元のコンテキストで連結コマンドを実行できる点が異なります。

必要なのは

(goto) 2>nul & del "%~f0"
67
dbenham
( del /q /f "%~f0" >nul 2>&1 & exit /b 0  )

これをスクリプトの最後に設定します。 (SHIFTコマンドを使用すると動作しない場合があります)

7
npocmaka
del "%~f0"

動作しますが、以前に開いたコンソールから呼び出すとエラーメッセージが表示されます(ただし無視できます)。

5
JeffRSon
del %0

ファイルの最後の行は、私が見つけた最も簡単な方法です。 %0は、現在実行中の.cmdファイル。

最初に試してみたときに、「使用中のファイル」エラーが表示されると思っていましたが、まだ発生していません。

2
archer

この質問 、(保留中)への答えとして、このバッチは3回実行すると自己破壊します。これを実現するためのコードは、最後の3行にまとめられています。 dbenhamの上記のヒント が組み込まれています

@Echo off
Rem batch main purpose
Rem
Rem
Set Tok=###&For /f %%C in ('find /C "%Tok%" ^<"%~f0"') Do Set /A Cnt=%%C
Echo Run-%Cnt%&If %Cnt% Geq 3 (goto) 2>nul & del "%~f0"
Echo %Tok%>>"%~f0"& Goto :Eof

バッチは、実行のたびにトークンを追加し、トークンの発生をカウントすることにより、自分自身を変更します。数に達すると、それ自体を削除します。

> Dir /B Kill*
KillMySelf.cmd

> KillMySelf.cmd
Run-1

> KillMySelf.cmd
Run-2

> KillMySelf.cmd
Run-3

> Dir /B Kill*
File Not Found
1
LotPings

デスクトップ上の場合はdel (name)を使用できます。それ以外の場合はdel (path to file ex. del C:\WINDOWS

P.Sはエラーメッセージを作成しません

0
ThE WAtChEr

バッチファイルの最終行としてdel%0

0
Sam

競合状態を回避するために遅延を設定できます。ここでは15秒です。

START /B CMD.EXE /D /C "PING.EXE -n 15 127.0.0.1 && DEL prova.bat"

ノート

  • CMD.EXE/Dは、自動実行クラップウェアの実行を回避するために必須です
  • PINGとDELは同期して実行する必要があるため、引用符で囲みます
  • 「%〜f0」を使用してバッチ名を渡す方法をユーザーに伝えます
0
Massimo