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

<p>можно ли сделать так, чтобы командный файл сам себя удалил?</p><p>я пытался заставить его выполнить другой файл, чтобы удалить его, но это не сработало, кто-нибудь знает, как я мог это сделать. пакетный файл, который я использую, повышен. моя ос windows 7 32 бит.</p>

<p>ответ npocmaka работает, но он генерирует следующее сообщение об ошибке: "<strong><em>пакетный файл не может быть найден.</em></strong>" это не проблема, если окно консоли закрывается, когда скрипт завершается, как сообщение будет мигать так быстро, никто не увидит. но это очень нежелательно, если консоль остается открытой после завершения сценария.</p><p>хитрость в удалении файла без сообщения об ошибке состоит в том, чтобы заставить другой скрытый процесс удалить файл после завершения сценария. это легко сделать с помощью start/b для запуска процесса удаления. процесс удаления должен инициироваться и выполняться, поэтому родительский сценарий имеет шанс завершить работу до того, как произойдет удаление.</p><pre><code>start /b "" cmd /c del "%~f0"&exit /b </code></pre><p>вы можете просто использовать подпрограмму called, если вас беспокоит shift, уничтожающий значение <code>%0</code>.</p><pre><code>call :deleteself&exit /b :deleteself start /b "" cmd /c del "%~f0"&exit /b </code></pre><p><strong><em>обновление 2015-07-16</em></strong></p><p>я обнаружил еще один очень удобный способ удалить пакетный скрипт, не создавая сообщения об ошибке. техника зависит от недавно обнаруженного поведения goto (обнаруженного некоторыми русскими), описанного на английском языке по адресу <a href="http://www.dostips.com/forum/viewtopic.php?f=3&t=6491">http://www.dostips.com/forum/viewtopic.php?f=3&t=6491</a> </p><p>таким образом, <code>(goto) 2>nul</code> ведет себя как <code>exit /b</code>, за исключением того, что он позволяет выполнять сцепленные команды в контексте вызывающей стороны!</p><p>так что все, что вам нужно, это</p><pre><code>(goto) 2>nul & del "%~f0" </code></pre>

<pre><code>( del /q /f "%~f0" >nul 2>&1 & exit /b 0 ) </code></pre><p>установите это в конце сценария. (может не работать, если используется команда <code>shift</code>)</p>

<pre><code>del "%~f0" </code></pre><p>будет работать, но есть сообщение об ошибке, если вы вызываете его с ранее открытой консоли (однако может быть проигнорировано).</p>

<pre><code>del %0 </code></pre><p>поскольку последняя строка файла - самый простой способ, который я нашел. <code>%0</code> возвращает имя исполняемого в данный момент файла <code>.cmd</code>. </p><p>когда я впервые попробовал это сделать, я думал, что получу ошибку «файл используется», но этого пока не произошло.</p>

<p>в качестве ответа на <a href="https://stackoverflow.com/questions/41914570/self-destructing-bat-or-cmd-after-three-runs">этот вопрос</a> (который отложен) эта партия будет самоуничтожена после трех запусков. код для достижения этого сжат в последние 3 строки. он включает в себя <a href="https://stackoverflow.com/a/20333575/6811411">приведенный выше совет от dbenham</a> </p><pre><code>@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 </code></pre><p>пакет модифицирует себя, добавляя токен после каждого запуска и подсчитывая вхождения токена. если номер достигнут, он удаляет себя.</p><pre><code>> dir /b kill* killmyself.cmd > killmyself.cmd run-1 > killmyself.cmd run-2 > killmyself.cmd run-3 > dir /b kill* file not found </code></pre>

<p>вы можете использовать <code>del (name)</code>, если на рабочем столе, в противном случае используйте <code>del (path to file ex. del c:\windows</code>.</p><p>p.s не делает сообщение об ошибке</p>

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

<p>вы можете установить задержку, чтобы избежать условий гонки, здесь 15 секунд:</p><pre><code>start /b cmd.exe /d /c "ping.exe -n 15 127.0.0.1 && del prova.bat" </code></pre><p>заметки</p><ul> <li>cmd.exe/d является обязательным, чтобы избежать выполнения автоматического запуска дерьма</li> <li>ping и del должны выполняться синхронно, поэтому должны быть заключены в кавычки</li> <li>я дал пользователям, как передать имя пакета, используя "% ~ f0"</li> </ul>