Как сделать.BAT файл удалить его самостоятельно после завершения?

Как сделать .BAT файл удалить его самостоятельно после завершения? У меня есть простой файл bat, который завершает процесс. Я хочу этого .BAT файл, чтобы удалить себя.

6 ответов


@ECHO OFF
SETLOCAL

SET someOtherProgram=SomeOtherProgram.exe
TASKKILL /IM "%someOtherProgram%"

ECHO "This script will now self-destruct. Please ignore the next error message"
DEL "%~f0"

обратите внимание, что строка DEL лучше быть последним, что вы собираетесь выполнить внутри пакетного файла, иначе вам не повезло:)

это распечатает уродливое сообщение об ошибке, но оно доброкачественное, и код немного менее запутанный таким образом. Если вы заботитесь о том, чтобы избавиться от сообщения об ошибке, см. dbenham это!--5-->, чтобы избавиться от него.


ответ Мерлина Моргана-Грэма удается удалить запущенный пакетный скрипт, но он генерирует следующее сообщение об ошибке:"пакетный файл не найден. " это не проблема, если окно консоли закрывается, когда скрипт завершается, так как сообщение будет мигать так быстро, что никто его не увидит. Но сообщение об ошибке очень нежелательно, если консоль остается открытой после завершения скрипта.

Джон Faminella имеет правильное представление, что другой процесс необходим для чистого удаления пакетного файла без ошибок. Планирование задачи может работать, но есть более простой способ: используйте START для запуска нового процесса удаления в той же консоли. Для запуска и выполнения процесса требуется время, поэтому родительский скрипт имеет возможность завершить работу до того, как произойдет удаление.

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

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

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

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

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

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

вы не упомянули ОС, но если это на Windows XP Professional, и у вас есть соответствующие разрешения, вы можете иметь пакетный файл запланировать однократную запланированную задачу Windows, чтобы удалить файл в более позднее время. Используйте , документирован здесь.

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


просто добавьте эту команду в последнюю строку вашего пакетного файла

Del batch_file_name.bat

batch_file_name.bat - это имя вашего пакетного файла

Ура


вы могли бы сделать @Мерлина ответ

@ECHO OFF
SETLOCAL
SET someOtherProgram=SomeOtherProgram.exe
TASKKILL /IM "%someOtherProgram%"
DEL "%~f0"

Теперь сделайте vbscript с этой кодировкой и сохраните его как скрытый.vbs, этот vbscript скроет окно пакетного файла.

set w = CreateObject(“WScript.Shell”)
W.Run chr(34) & “%userprofile%\desktop\the_batch_file.bat” & chr(34), 0
set w= Nothing

затем запустите этот пакетный файл VBScript

@ECHO OFF
SETLOCAL
SET someOtherProgram=SomeOtherProgram.exe
TASKKILL /IM "%someOtherProgram%"
start "path to hidden.vbs"
DEL "%~f0"

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


вы также можете направить вывод дель "%~F0", расположенный к нулевому выходу, например...

@ECHO OFF
SETLOCAL
SET someOtherProgram=SomeOtherProgram.exe
TASKKILL /IM "%someOtherProgram%"
DEL "%~f0" > NUL