Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Auto-effacer un bat

23 réponses
Avatar
~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 -

10 réponses

1 2 3
Avatar
Jacques Barathon [MS]
"~Jean-Marc~ [MVP]" wrote in message
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

Avatar
~Jean-Marc~ [MVP]
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 -

Avatar
jbongran
Jacques Barathon [MS] wrote:
"~Jean-Marc~ [MVP]" wrote in message
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%"


Avatar
Jacques Barathon [MS]
"jbongran" wrote in message
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

Avatar
Méta-MCI \(MVP\)
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
Avatar
Méta-MCI \(MVP\)
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
Avatar
Jacques Barathon [MS]
"Méta-MCI (MVP)" wrote in message
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

Avatar
Gilles LAURENT [MVP]
"~Jean-Marc~ [MVP]" a écrit dans le
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


Avatar
Méta-MCI \(MVP\)
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
Avatar
jbongran
Gilles LAURENT [MVP] wrote:
"~Jean-Marc~ [MVP]" a écrit dans le
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%



1 2 3