Файл bat знает свое имя и может ли он удалить себя? - PullRequest
5 голосов
/ 03 октября 2010

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

Ответы [ 5 ]

12 голосов
/ 09 июня 2013

Ни один из существующих ответов не предоставляет чистый способ для пакетного файла удалить себя и выйти без видимого сообщения об ошибке.

Простое включение del "%~f0" удаляет сценарий, но также приводит к уродливому "Пакетный файл не может быть найден." сообщение об ошибке.

Если скрипт разрешает закрыть родительский процесс CMD (окно консоли), то следующее работает нормально без каких-либосообщение об ошибке:

del "%~f0"&exit

Но это немного сложнее, если вы хотите, чтобы скрипт удалил сам себя и завершил работу без закрытия родительского процесса CMD и без какого-либо сообщения об ошибке.

Метод 1: Запустите второй процесс, который выполняется в том же окне консоли, которое фактически выполняет удаление.EXIT /B, вероятно, не является необходимым, но я вставил его, чтобы максимизировать вероятность того, что пакетный скрипт закроется до того, как процесс STARTed попытается удалить файл.

start /b "" cmd /c del "%~f0"&exit /b

Метод 2: Создание и передача управленияв другой временный пакетный файл, который удаляет себя и вызывающего, но не использует CALL и перенаправляет stderr на nul.

>"%~f0.bat" echo del "%~f0" "%~f0.bat"
2>nul "%~f0.bat"
3 голосов
/ 03 октября 2010

Если я не ошибаюсь,% 0 будет путем, используемым для вызова командного файла.

2 голосов
/ 03 октября 2010

Проверено и работает:

del %0
exit
1 голос
/ 03 октября 2010

% 0 дает вам относительный путь от каталога, где был запущен файл bat.Так что если вы назовете это

mybats\delyourself.bat tango roger

% 0 будет содержать mybats\delyourself.bat

del %0, если вы не изменили свой текущий каталог.

%~f0расширяется до полного пути к файлу.

0 голосов
/ 31 марта 2014

Для меня было важно, что у меня нет errorLevel 1 после выхода из командного файла. Я нашел подходящий и простой ответ следующим образом: DeleteMyself.cmd:

START CMD /C DEL DeleteMyself.cmd

Тестовый пакет, если DeleteMyself.cmd возвращает errorLevel 0. TestDeleteMyself.cmd :

call DeleteMyself.cmd
echo Errorlevel: %errorLevel%
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...