How to make a batch file delete itself?

62,827

Solution 1

npocmaka's answer works, but it generates the following error message: "The batch file cannot be found." This isn't a problem if the console window closes when the script terminates, as the message will flash by so fast, no one will see it. But it is very undesirable if the console remains open after the script terminates.

The trick to deleting the file without an error message is to get another hidden process to delete the file after the script terminates. This can easily be done using START /B to launch a delete process. It takes time for the delete process to initiate and execute, so the parent script has a chance to terminate cleanly before the delete happens.

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

You can simply use a CALLed subroutine if you are worried about SHIFT trashing the %0 value.

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

Update 2015-07-16

I've discovered another really slick way to have a batch script delete itself without generating any error message. The technique depends on a newly discovered behavior of GOTO (discovered by some Russians), described in English at http://www.dostips.com/forum/viewtopic.php?f=3&t=6491

In summary, (GOTO) 2>NUL behaves like EXIT /B, except it allows execution of concatenated commands in the context of the caller!

So all you need is

(goto) 2>nul & del "%~f0"

The returned ERRORLEVEL will be 0 because DEL is the last command and it always clears the ERRORLEVEL.

If you need to have control of the ERRORLEVEL, then something like

(goto) 2>nul & del "%~f0" & cmd /c exit /b 10

Solution 2

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

Set this at the end of the script. (might not work if SHIFT command is used)

Solution 3

del "%~f0"

will work, but there's an error message if you call it from a previously open console (can be ignored however).

Solution 4

del %0

As the last line of the file is the easiest way I've found. %0 returns the name of the currently executing .cmd file.

When I first tried it, I thought I would get a "file in use" error, but that hasn't happened so far.

Solution 5

As an answer to this question, (which is put on hold) this batch will selfdestruct after three runs. The code to achieve this is condensed in the last 3 lines. It incorporates the above tip from 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

The batch modifies itself by appending a token after each run and counting the occurences of the token. If the number is reached it deletes itself.

> Dir /B Kill*
KillMySelf.cmd

> KillMySelf.cmd
Run-1

> KillMySelf.cmd
Run-2

> KillMySelf.cmd
Run-3

> Dir /B Kill*
File Not Found
Share:
62,827

Related videos on Youtube

09stephenb
Author by

09stephenb

hello.

Updated on July 09, 2022

Comments

  • 09stephenb
    09stephenb almost 2 years

    Is it possible to make a batch file delete itself?

    I have tried to make it execute another file to delete it but this did not work.

    Does any one know how I could do it?

    The batch file I am using is elevated. My OS is Windows 7 32 bit.

  • dbenham
    dbenham over 10 years
    This works, but it generates "The batch file cannot be found." error. See my answer for a solution.
  • vvnurmi
    vvnurmi almost 6 years
    This lets you return an arbitrary errorcode that the (goto) solution doesn't allow.
  • Scott - Слава Україні
    Scott - Слава Україні almost 6 years
    ISTM that this works fine without the parentheses; i.e., goto 2> nul & …
  • MDuh
    MDuh almost 5 years
    You can also use the TIMEOUT command to make it wait and make it not so jarring for regular users. You can also press a button to end it ahead of time. Note that it only works with Windows 7 and newer.
  • dbenham
    dbenham over 4 years
    @vvnurmi - I've updated the (goto) solution to show how to return your own errorcode.
  • RockPaperLz- Mask it or Casket
    RockPaperLz- Mask it or Casket over 3 years
    @Scott I concur. It seems to work fine without parens. I actually just created a batch file that creates another batch file that then deletes itself after it finishes all its work!
  • RockPaperLz- Mask it or Casket
    RockPaperLz- Mask it or Casket over 3 years
    @dbenham Any reason to believe that the parens around goto are needed or that omitting them will cause any issues?
  • dbenham
    dbenham over 3 years
    @RockPaperLz-MaskitorCasket - It should work just fine without the parens. I include them to make it obvious that I intentionally did not include a target for the GOTO.
  • RockPaperLz- Mask it or Casket
    RockPaperLz- Mask it or Casket over 3 years
    @dbenham Thank you for the update and clarification on why you chose to include them in your example. Very much appreciated.
  • Sergio Perez
    Sergio Perez almost 3 years
    Thank you, your solution is so elegant
  • Billy Cao
    Billy Cao over 2 years
    Hi i have a problem - i used goto 2>nul & del "%~f0" and my cmd window isnt closing automatically after the script finishes. If I use exit /b only, it will close. If I add an exit /b at the end together with goto 2>nul & del "%~f0", it will not close. Any idea on why is that so and how do I make it close by itself? Thanks