web-dev-qa-db-fra.com

Comment faire un fichier de commandes supprimer lui-même?

Est-il possible de supprimer un fichier de commandes lui-même?

J'ai essayé de lui faire exécuter un autre fichier pour le supprimer, mais cela ne fonctionnait pas. Le fichier batch que j'utilise est élevé. Mon système d'exploitation est Windows 7 32 bits.

31
09stephenb

la réponse de npocmaka fonctionne, mais elle génère le message d'erreur suivant: "le fichier de commandes est introuvable.} [" Ce n'est pas un problème si la fenêtre de la console se ferme à la fin du script clignotera si vite, personne ne le verra. Mais il est très indésirable que la console reste ouverte après la fin du script.

L'astuce pour supprimer le fichier sans message d'erreur consiste à obtenir un autre processus masqué pour supprimer le fichier après la fin du script. Cela peut facilement être fait en utilisant START/B pour lancer un processus de suppression. Il faut un certain temps pour que le processus de suppression soit lancé et exécuté, de sorte que le script parent ait une chance de se terminer correctement avant la suppression.

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

Vous pouvez simplement utiliser un sous-programme CALLed si vous craignez que SHIFT ne supprime la valeur %0.

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

Mise à jour du 16/07/2015

J'ai découvert un autre moyen très astucieux de faire se supprimer un script batch sans générer de message d'erreur. La technique dépend d'un comportement nouvellement découvert de GOTO (découvert par certains Russes), décrit en anglais sur http://www.dostips.com/forum/viewtopic.php?f=3&t=6491

En résumé, (GOTO) 2>NUL se comporte comme EXIT /B, sauf qu'il permet l'exécution de commandes concaténées dans le contexte de l'appelant!

Donc tout ce dont vous avez besoin c'est

(goto) 2>nul & del "%~f0"
59
dbenham
( del /q /f "%~f0" >nul 2>&1 & exit /b 0  )

Définissez ceci à la fin du script. (pourrait ne pas fonctionner si la commande SHIFT est utilisée)

7
npocmaka
del "%~f0"

fonctionnera, mais il y aura un message d'erreur si vous l'appelez depuis une console précédemment ouverte (peut être ignoré cependant).

5
JeffRSon
del %0

Comme la dernière ligne du fichier est le moyen le plus simple que j'ai trouvé. %0 renvoie le nom du fichier .cmd en cours d'exécution. 

Lorsque je l'ai essayé pour la première fois, je pensais avoir l'erreur "Fichier en cours d'utilisation", mais cela ne s'est pas encore produit.

2
archer

En réponse à cette question , (qui est mise en attente), ce lot s’autodétruira après trois exécutions. Le code pour y parvenir est condensé dans les 3 dernières lignes. Il incorpore le au-dessus de 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

Le lot se modifie lui-même en ajoutant un jeton après chaque exécution et en comptant les occurrences du jeton. Si le nombre est atteint, il se supprime.

> 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

Vous pouvez utiliser del (name) s'il utilise le bureau, sinon utilisez del (path to file ex. del C:\WINDOWS.

P.S ne fait pas d'erreur msg

0
ThE WAtChEr

del% 0 en tant que dernière ligne du fichier de commandes

0
Sam

vous pouvez définir le délai pour éviter les conditions de course, voici 15 secondes:

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

REMARQUES

  • CMD.EXE/D est obligatoire pour éviter l’exécution automatique de crap-ware.
  • PING et DEL doivent être exécutés de manière synchrone, donc entourés de guillemets
  • Je laisse aux utilisateurs comment passer le nom du lot en utilisant "% ~ f0"
0
Massimo