2010-05-22 2 views
25

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

+6

Так что вы хотите пакетный файл, который не показывает никаких окон, убивает обрабатывать и удалять себя после завершения. Просто из любопытства. Зачем? –

ответ

31
@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, чтобы избавиться от него.

+0

Не могли бы вы немного объяснить это? Что такое someotherprogram.exe и что вы используете в нем? –

+0

@Richard: 'SomeOtherProgram.exe' может быть изменен как любая программа. Например, 'notepad.exe'. Это программа, которая будет убита, и не имеет значения, что делает эта программа - этот пакетный файл не волнует. Он просто использует 'TaskKill', чтобы убить задачу с этим именем exe. Это ясно? Если да, считаете ли вы, что его нужно добавить в ответ? Если нет, пожалуйста, объясните более подробно, какие части вы понимаете, а какие нет. –

+2

Спасибо за ответ @Merlyn. Моя вина, я не хорошо прочитал вопрос. Я выяснял, почему вам нужно убить процесс, чтобы удалить летучую мышь. :) –

4

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

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

+2

На самом деле существует удивительно простой способ получить пакетный файл для удаления без ошибок, который не требует специальных разрешений. См. [Мой ответ] (http://stackoverflow.com/a/20333152/1012053) – dbenham

1

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

Del batch_file_name.bat 

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

Приветствия

+2

Не работает. –

+0

* @ Ricardo Polo * Нет, это не сработает, потому что процесс заблокирован, поэтому, если PID не выпущен, файл не будет удален. Я на самом деле думал, что это то, что обсуждается выше, но * @ Хани Лудин *, похоже, пропустил это! – CriticalPoint

35

Ответ 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" 
+1

Мне нравится ваше 2-е решение. Первый, скорее всего, будет работать хорошо, но я не уверен, что он строго гарантированно работает, если 'start' удается завершить свою работу до завершения текущего интерпретатора пакетного сценария. Я предполагаю, что любое состояние гонки вряд ли будет проблемой, если планировщик процессов работает прилично или система не находится под большой нагрузкой, поэтому это, вероятно, просто нит-кик. –

+0

(и «гарантированно работать», я имею в виду гарантированно избегать сообщения об ошибке) –

+0

@ MerlynMorgan-Graham - Это состояние гонки, так что вы технически верны. Но мне трудно представить себе сценарий, когда тайминги меняются на противоположные. Может быть интересным проектом, пытающимся спрогнозировать сбой – dbenham

0

вы могли бы сделать @ 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" 

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

0

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

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

извините, но обсуждаемое сообщение об ошибке не происходит из 'del', а потому, что интерпретатор пытается прочитать« следующую команду »из теперь удаленного файла. Ваше предложение не подавляет это. – Stephan

+0

Я не получил сообщение об ошибке, когда я запускал его таким образом, но без него. –

+2

для меня это точно то же самое, с или без '> nul'.Как я уже сказал, ошибка не исходит от 'del', поэтому перенаправление вывода' del' не поможет (кроме того: для подавления ERRORS вам нужно перенаправить STDERR: '2> nul' - t помочь.) – Stephan

Смежные вопросы