Как сделать так, чтобы файл .BAT самостоятельно удалялся после завершения? - PullRequest
28 голосов
/ 22 мая 2010

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

Ответы [ 6 ]

40 голосов
/ 02 декабря 2013

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

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

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"
33 голосов
/ 23 мая 2010
@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 , чтобы избавиться от него.

4 голосов
/ 22 мая 2010

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

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

1 голос
/ 04 ноября 2010

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

Del batch_file_name.bat

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

Приветствия

0 голосов
/ 29 марта 2017

Вы можете также направить вывод DEL "% ~ f0" на NULL, как показано ...

@ECHO OFF
SETLOCAL
SET someOtherProgram=SomeOtherProgram.exe
TASKKILL /IM "%someOtherProgram%"
DEL "%~f0" > NUL
0 голосов
/ 30 июля 2016

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

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

Теперь создайте vbscript с этой кодировкой и сохраните его как hidden.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"

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...