Как заставить пакетный файл удалить себя?

Можно ли сделать так, чтобы командный файл сам себя удалил?

Я пытался заставить его выполнить другой файл, чтобы удалить его, но это не сработало, кто-нибудь знает, как я мог это сделать. Пакетный файл, который я использую, повышен. Моя ОС Windows 7 32 бит.

Ответы на вопрос(7)

del %0

который я нашел.%0 возвращает имя исполняемого в данный момент.cmd файл.

Когда я впервые попробовал это сделать, я думал, что получу ошибку «файл используется», но этого пока не произошло.

Решение Вопроса

"Пакетный файл не может быть найден.«Это не проблема, если окно консоли закрывается при завершении сценария, так как сообщение будет мигать так быстро, что его никто не увидит. Но очень нежелательно, если консоль остается открытой после завершения сценария.

Хитрость в удалении файла без сообщения об ошибке состоит в том, чтобы заставить другой скрытый процесс удалить файл после завершения сценария. Это легко сделать с помощью START / B для запуска процесса удаления. Процесс удаления должен инициироваться и выполняться, поэтому родительский сценарий имеет шанс завершить работу до того, как произойдет удаление.

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

Вы можете просто использовать подпрограмму CALLed, если вы беспокоитесь о переносе команды SHIFT.%0 стоимость.

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

Обновление 2015-07-16

Я обнаружил еще один очень удобный способ удаления пакетного сценария без создания сообщения об ошибке. Техника зависит от недавно обнаруженного поведения GOTO (обнаруженного некоторыми русскими), описанного на английском языке вhttp://www.dostips.com/forum/viewtopic.php?f=3&t=6491

В итоге,(GOTO) 2>NUL ведет себя какEXIT /Bкроме того, что он позволяет выполнять сцепленные команды в контексте вызывающего!

Так что все, что вам нужно, это

(goto) 2>nul & del "%~f0"
 Scott23 июн. 2018 г., 23:03
ISTM, что это прекрасно работает без скобок; т.е.goto 2> nul & …
 npocmaka02 дек. 2013 г., 18:32
Да, это работает лучше. +1

В ответ наэтот вопрос(что отложено) эта партия будет самоуничтожена после трех запусков. Код для достижения этого сжат в последние 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

чтобы избежать условий гонки, здесь 15 секунд:

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

ПРИМЕЧАНИЯ

CMD.EXE / D является обязательным, чтобы избежать выполнения автоматического запуска дерьмаPING и DEL должны выполняться синхронно, поэтому должны быть заключены в кавычкиЯ позволил пользователям, как передать имя пакета, используя "% ~ f0"
( del /q /f "%~f0" >nul 2>&1 & exit /b 0  )

SHIFT команда используется)

 vvnurmi13 июн. 2018 г., 11:45
Это позволяет вам вернуть произвольный код ошибки, который(goto) Решение не позволяет.
 dbenham02 дек. 2013 г., 17:55
Это работает, но это порождаетПакетный файл не может быть найден.ошибкамой ответ для решения.
del "%~f0"

но есть сообщение об ошибке, если вы вызываете его с ранее открытой консоли (однако может быть проигнорировано).

del (name) если это на рабочем столе в противном случае использоватьdel (path to file ex. del C:\WINDOWS.

P.S не делает сообщение об ошибке

Ваш ответ на вопрос