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.
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"
( 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)
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).
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.
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
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
del% 0 en tant que dernière ligne du fichier de commandes
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