Как сделать .BAT-файл удалить его после завершения? У меня есть простой файл bat, который завершает процесс. Я хочу, чтобы этот .BAT-файл удалял сам.Как сделать .BAT-файл удалить его после завершения?
ответ
@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's answer, чтобы избавиться от него.
Не могли бы вы немного объяснить это? Что такое someotherprogram.exe и что вы используете в нем? –
@Richard: 'SomeOtherProgram.exe' может быть изменен как любая программа. Например, 'notepad.exe'. Это программа, которая будет убита, и не имеет значения, что делает эта программа - этот пакетный файл не волнует. Он просто использует 'TaskKill', чтобы убить задачу с этим именем exe. Это ясно? Если да, считаете ли вы, что его нужно добавить в ответ? Если нет, пожалуйста, объясните более подробно, какие части вы понимаете, а какие нет. –
Спасибо за ответ @Merlyn. Моя вина, я не хорошо прочитал вопрос. Я выяснял, почему вам нужно убить процесс, чтобы удалить летучую мышь. :) –
Вы не упомянули ОС, но если это относится к Windows XP Professional и у вас есть соответствующие разрешения, вы можете иметь расписание пакетного файла однозадачную запланированную задачу Windows, чтобы удалить файл позднее. Используйте команду schtasks
, задокументированную here.
В противном случае вы, как правило, не можете удалить файл, который выполняется, поскольку это имеет потенциал для всех видов гадостей. Кроме того, попытка удалить исполняемый файл, который используется, рассматривается как очень подозрительное поведение любого количества антивирусных программ, поэтому вполне вероятно, что вы тоже столкнетесь с этим.
На самом деле существует удивительно простой способ получить пакетный файл для удаления без ошибок, который не требует специальных разрешений. См. [Мой ответ] (http://stackoverflow.com/a/20333152/1012053) – dbenham
Просто добавьте эту команду в последней строке пакетного файла
Del batch_file_name.bat
batch_file_name.bat
это имя вашего пакетного файла
Приветствия
Не работает. –
* @ Ricardo Polo * Нет, это не сработает, потому что процесс заблокирован, поэтому, если PID не выпущен, файл не будет удален. Я на самом деле думал, что это то, что обсуждается выше, но * @ Хани Лудин *, похоже, пропустил это! – CriticalPoint
Ответ Merlyn Морган-Graham удается удалить запущен пакетный скрипт, но он генерирует следующее сообщение об ошибке: «Не удалось найти командный файл.« Это не ap roblem, если окно консоли закрывается, когда сценарий завершается, так как сообщение будет мигать так быстро, что его никто не увидит. Но сообщение об ошибке очень нежелательно, если консоль остается открытой после завершения сценария.
John Faminella имеет правильную идею о том, что требуется другой процесс для чистого удаления командного файла без ошибок. Планирование задачи может работать, но есть более простой способ: использовать 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"
Мне нравится ваше 2-е решение. Первый, скорее всего, будет работать хорошо, но я не уверен, что он строго гарантированно работает, если 'start' удается завершить свою работу до завершения текущего интерпретатора пакетного сценария. Я предполагаю, что любое состояние гонки вряд ли будет проблемой, если планировщик процессов работает прилично или система не находится под большой нагрузкой, поэтому это, вероятно, просто нит-кик. –
(и «гарантированно работать», я имею в виду гарантированно избегать сообщения об ошибке) –
@ MerlynMorgan-Graham - Это состояние гонки, так что вы технически верны. Но мне трудно представить себе сценарий, когда тайминги меняются на противоположные. Может быть интересным проектом, пытающимся спрогнозировать сбой – dbenham
вы могли бы сделать @ 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"
Это скроет пакетный файл перед его удалением делает сообщение об ошибке невозможно увидеть.
Вы можете также направить выход DEL «% ~ f0» на NULL выход, как так ...
@ECHO OFF
SETLOCAL
SET someOtherProgram=SomeOtherProgram.exe
TASKKILL /IM "%someOtherProgram%"
DEL "%~f0" > NUL
извините, но обсуждаемое сообщение об ошибке не происходит из 'del', а потому, что интерпретатор пытается прочитать« следующую команду »из теперь удаленного файла. Ваше предложение не подавляет это. – Stephan
Я не получил сообщение об ошибке, когда я запускал его таким образом, но без него. –
для меня это точно то же самое, с или без '> nul'.Как я уже сказал, ошибка не исходит от 'del', поэтому перенаправление вывода' del' не поможет (кроме того: для подавления ERRORS вам нужно перенаправить STDERR: '2> nul' - t помочь.) – Stephan
- 1. Удалить анимацию после завершения
- 2. Как сделать JSONArray пустым или удалить его
- 3. Как удалить анимацию после ее завершения
- 4. Как позвонить в цикл после его завершения
- 5. Как удалить файл после завершения другого процесса?
- 6. Как удалить спрайт после завершения анимации?
- 7. Удалить просмотры после завершения анимации
- 8. Как удалить событие прокрутки после завершения функций
- 9. Процесс записи после его завершения?
- 10. Удалить файл после завершения сценария
- 11. Как завершить дочерний процесс после его завершения?
- 12. Как остановить выполнение процесса после его завершения
- 13. Сделать pageViewController После завершения NSURLSession
- 14. Как сделать браузер закрытым после завершения загрузки?
- 15. Удалить анимацию UIImageView после завершения NSOperationQueue
- 16. Удалить класс с затуханием после завершения Timeinterval?
- 17. запустить java-поток непрерывно после его завершения
- 18. Отключен ли std :: thread после его завершения?
- 19. Член, измененный методом возврата после его завершения
- 20. TransitionDrawable: автоматически обратный переход после его завершения
- 21. ruby restart script автоматически после его завершения
- 22. Перезапуск таймера обратного отсчета после его завершения
- 23. Необходимо удалить экспортированную переменную после завершения Снега
- 24. Удалить div после завершения функции jQuery
- 25. Как удалить файл после завершения потока в java?
- 26. Перезапуск процесса/команды после интервала после его последнего завершения
- 27. jQuery сделать что-то после завершения анимации
- 28. Как удалить временные файлы mongrel после завершения загрузки?
- 29. Android, как удалить журнал вызовов после завершения исходящего вызова
- 30. Golang Как удалить сгенерированный zip-файл после завершения загрузки пользователя?
Так что вы хотите пакетный файл, который не показывает никаких окон, убивает обрабатывать и удалять себя после завершения. Просто из любопытства. Зачем? –