it-swarm.com.ru

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

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

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

31
09stephenb

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

Хитрость в удалении файла без сообщения об ошибке состоит в том, чтобы заставить другой скрытый процесс удалить файл после завершения сценария. Это легко сделать с помощью 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"
59
dbenham
( del /q /f "%~f0" >nul 2>&1 & exit /b 0  )

Установите это в конце сценария. (может не работать, если используется команда SHIFT)

7
npocmaka
del "%~f0"

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

5
JeffRSon
del %0

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

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

2
archer

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

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

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

0
ThE WAtChEr

del% 0 как последняя строка командного файла

0
Sam

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

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

ЗАМЕТКИ

  • CMD.EXE/D является обязательным, чтобы избежать выполнения автоматического запуска дерьма
  • PING и DEL должны выполняться синхронно, поэтому должны быть заключены в кавычки
  • Я дал пользователям, как передать имя пакета, используя "% ~ f0"
0
Massimo