Auto-effacer un bat

Le
~Jean-Marc~ [MVP]
Bonjour à tous,

petit quizzzzzzz.. :-)

Il arrive de temps à autre que j'aie à lancer des batchs qui
ne servent qu'une fois (des installations, souvent).

Pour ne pas laisser trainer des bat partout sur le disque dur,
j'utilise cette astuce :

Au début du bat :
set bat=%0%

Et en dernière ligne :
start /B %comspec% /c "ping 127.0.0.1 -n 5 && del /f %bat%"

Je serais curieux de savoir si vous avez une autre méthode ?
(en bat de préférence, autres languages acceptés ;-) )

@+

--
~Jean-Marc~ MVP Shell/User Fr
( Vista x86 Ultimate )
- http://msmvps.com/blogs/docxp/ -
- http://docxp.mvps.org -
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses Page 1 / 3
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Jacques Barathon [MS]
Le #678392
"~Jean-Marc~ [MVP]" news:%
Bonjour à tous,

petit quizzzzzzz..... :-)

Il arrive de temps à autre que j'aie à lancer des batchs qui
ne servent qu'une fois (des installations, souvent).

Pour ne pas laisser trainer des bat partout sur le disque dur,
j'utilise cette astuce :

Au début du bat :
set bat=%0%

Et en dernière ligne :
start /B %comspec% /c "ping 127.0.0.1 -n 5 && del /f %bat%"

Je serais curieux de savoir si vous avez une autre méthode ?
(en bat de préférence, autres languages acceptés... ;-) )


Un simple del %0 en fin de batch semble faire l'affaire. Dans mes tests, le
del retourne un message d'erreur mais le fichier est bien supprimé.

Par contre, la variable %0 ne contient que le nom du batch tel qu'il a été
appelé. Il faut donc veiller à ce que les appels au batch contiennent son
nom complet (avec l'extension) et éventuellement son chemin d'accès s'il y a
un risque que le batch change de répertoire de travail en cours de route.

Jacques

~Jean-Marc~ [MVP]
Le #678391
Salut Jacques Barathon [MS],
tu nous disais :
Un simple del %0 en fin de batch semble faire l'affaire. Dans mes
tests, le del retourne un message d'erreur mais le fichier est bien
supprimé.


J'ai eu des soucis avec cette méthode...

Par contre, la variable %0 ne contient que le nom du batch tel qu'il
a été appelé. Il faut donc veiller à ce que les appels au batch
contiennent son nom complet (avec l'extension) et éventuellement son
chemin d'accès s'il y a un risque que le batch change de répertoire
de travail en cours de route.


Très bonne remarque. C'est d'ailleurs pour cela que j'affecte %bat%
au début. Il faudrait que je vérifie les altérations de %0% suivant les
actions du batch.

@+

--
~Jean-Marc~ MVP Shell/User Fr
( Vista x86 Ultimate )
- http://msmvps.com/blogs/docxp/ -
- http://docxp.mvps.org -

jbongran
Le #678389
Jacques Barathon [MS] wrote:
"~Jean-Marc~ [MVP]" news:%
Bonjour à tous,

petit quizzzzzzz..... :-)

Il arrive de temps à autre que j'aie à lancer des batchs qui
ne servent qu'une fois (des installations, souvent).

Pour ne pas laisser trainer des bat partout sur le disque dur,
j'utilise cette astuce :

Au début du bat :
set bat=%0%

Et en dernière ligne :
start /B %comspec% /c "ping 127.0.0.1 -n 5 && del /f %bat%"

Je serais curieux de savoir si vous avez une autre méthode ?
(en bat de préférence, autres languages acceptés... ;-) )


Un simple del %0 en fin de batch semble faire l'affaire. Dans mes
tests, le del retourne un message d'erreur mais le fichier est bien
supprimé.
Par contre, la variable %0 ne contient que le nom du batch tel qu'il
a été appelé. Il faut donc veiller à ce que les appels au batch
contiennent son nom complet (avec l'extension) et éventuellement son
chemin d'accès s'il y a un risque que le batch change de répertoire
de travail en cours de route.
Jacques


Vraiment pas un expert en bat, mais ceci à l'air de faire l'affaire:
set bat="%~dp0%0%"


Jacques Barathon [MS]
Le #678131
"jbongran" news:
...

Vraiment pas un expert en bat, mais ceci à l'air de faire l'affaire:
set bat="%~dp0%0%"


Presque :)
L'ajout de ~dp0 permet d'avoir le chemin complet, mais ça ne donne pas
l'extension. Embêtant si le batch a été appelé par son petit nom sans que
soit précisée son extension...

Jacques

Méta-MCI \(MVP\)
Le #678130
Bonjour !

(HS : Jacques, tu n'es pas (encore) dans la navette ? )

Bref, l'idée de jbongrain est très bonne.
Pour avoir l'extension, il suffit d'ajouter "x" (et "n" pour
le nom du fichier) :
set bat=%~dpnx0%
(guillemets à ajouter, selon la saison).


Pour les changements de répertoire, le problème est
effectivement contourné, si l'on met la ligne en début du
batch.



Pour le message d'erreur avec un simple del cela provient
du processeur de traitement des batchs, qui recharge
(intégralement) le fichier batch à la fin de chaque ligne
(ce qui permet de faire des batchs qui se modifient eux-même
en cours de traitement).
Du coup le processeur ne trouve pas le fichier, après
l'exécution du del, d'où le message d'erreur.

L'idée (de ~Jean-Marc~) du START, qui ouvre un nouvel
environnement est donc astucieuse.



@-salutations

Michel Claveau
Méta-MCI \(MVP\)
Le #678129
Re !

Il y a quand même un inconvénient, avec START /B : les
processeurs de commandes s'accumulent. On peut les voir,
ensuite, dans le gestionnaire de tâches.
Certes, ils disparaîtront à l'arrêt-machine suivant. Mais,
sur un serveur qui reste toujours en route...


Une solution légèrement différente :

set bat=%~dpnx0%
:::
echo del /f %bat%>%TEMP%DELE.BAT & %TEMP%DELE.BAT

Il restera un petit fichier, dans un répertoire temporaire,
qui sera nettoyé par windows, un jour ou l'autre.


@-salutations

Michel Claveau
Jacques Barathon [MS]
Le #678126
"Méta-MCI (MVP)" news:46bc6b69$0$25951$
Bonjour !

(HS : Jacques, tu n'es pas (encore) dans la navette ? )


Pas encore. Et d'ailleurs, avec leur problème d'isolation thermique je me
dis que j'ai bien fait de passer mon tour...

Bref, l'idée de jbongrain est très bonne.
Pour avoir l'extension, il suffit d'ajouter "x" (et "n" pour le nom du
fichier) :
set bat=%~dpnx0%
(guillemets à ajouter, selon la saison).


Je savais bien qu'un kador du batch aurait une telle combinaison dans sa
manche...

Pour le message d'erreur avec un simple del cela provient du processeur
de traitement des batchs, qui recharge (intégralement) le fichier batch à
la fin de chaque ligne (ce qui permet de faire des batchs qui se modifient
eux-même en cours de traitement).
Du coup le processeur ne trouve pas le fichier, après l'exécution du del,
d'où le message d'erreur.


Intéressant, j'ignorais que cmd.exe rechargeait un batch à la fin de chaque
ligne. Merci pour l'info. En effet, ça ouvre des perspectives! ;-)

Jacques

Gilles LAURENT [MVP]
Le #678125
"~Jean-Marc~ [MVP]" message de
news:%
| Bonjour à tous,

Bonjour,

| petit quizzzzzzz..... :-)
|
| Il arrive de temps à autre que j'aie à lancer des batchs qui
| ne servent qu'une fois (des installations, souvent).
|
| Pour ne pas laisser trainer des bat partout sur le disque dur,
| j'utilise cette astuce :
|
| Au début du bat :
| set bat=%0%
|
| Et en dernière ligne :
| start /B %comspec% /c "ping 127.0.0.1 -n 5 && del /f %bat%"
|
| Je serais curieux de savoir si vous avez une autre méthode ?
| (en bat de préférence, autres languages acceptés... ;-) )
|
| @+

Une solution alternative :

--- Couper ici : batch.bat ---
@echo off
set rm=%temp%rm.vbs
%rm% echo Set oFs=CreateObject("Scripting.FileSystemObject")
%rm% echo oFs.DeleteFile WScript.ScriptFullName,True
%rm% echo oFs.DeleteFile WScript.Arguments(0),True
start wscript %rm% %~dpnx0%


--- Couper ici : batch.bat ---

--
Gilles LAURENT [MVP]
http://glsft.free.fr


Méta-MCI \(MVP\)
Le #677821
Salut !


à tordu, tordu et demi :

@echo off

set bat=%~dpnx0%
echo %bat%
::
::
::
set h=%time:~0,2%
set m=%time:~3,2%
set /Am=m+1
if /I %m% GEQ 60 (
set /Ah+=1
set /Am-`
)
if /I %h% GEQ 24 set /Ah-$
at %h%:%m% cmd /cdel /f %bat%



Le fichier sera supprimé au début de la minute (calendaire) suivante.


@-salutations

Michel Claveau
jbongran
Le #677820
Gilles LAURENT [MVP] wrote:
"~Jean-Marc~ [MVP]" message de
news:%
Bonjour à tous,


Bonjour,

petit quizzzzzzz..... :-)

Il arrive de temps à autre que j'aie à lancer des batchs qui
ne servent qu'une fois (des installations, souvent).

Pour ne pas laisser trainer des bat partout sur le disque dur,
j'utilise cette astuce :

Au début du bat :
set bat=%0%

Et en dernière ligne :
start /B %comspec% /c "ping 127.0.0.1 -n 5 && del /f %bat%"

Je serais curieux de savoir si vous avez une autre méthode ?
(en bat de préférence, autres languages acceptés... ;-) )

@+


Une solution alternative :

--- Couper ici : batch.bat ---
<@echo off
set rm=%temp%rm.vbs
%rm% echo Set oFs=CreateObject("Scripting.FileSystemObject")
%rm% echo oFs.DeleteFile WScript.ScriptFullName,True
%rm% echo oFs.DeleteFile WScript.Arguments(0),True
start wscript %rm% %~dpnx0%


--- Couper ici : batch.bat ---


Petites variantes pour l'appel du vbs, qui n'a d'autre interêt que d'éviter
de parcourir la collection arguments, permettre le "retry" au cas où le bat
ne serait pas encore fermé, et l'usage de cscript au lieu de wscript,
permettant, au moins sur ma machien, d'éviter une fenêtre d'avertissement
;-)
Ps pour Gilles Laurent: je n'ai pas compris l'usage du %rm% en préfixe de
chaque ligne, tu peux m'en dire plus ?

@echo off
set rm=%temp%rm.vbs
%rm% echo Set oFs=CreateObject("Scripting.FileSystemObject")
%rm% echo oFs.DeleteFile WScript.ScriptFullName,True
%rm% echo Do Until oFs.FileExists %~dpnx0%
%rm% echo On Error Resume Next
%rm% echo oFs.DeleteFile %~dpnx0%,True
%rm% echo WScript.Sleep 100
%rm% echo Loop
%rm% echo Set oFs = Nothing
start Cscript %rm%



Publicité
Poster une réponse
Anonyme