Page 1 sur 1

[Func] SelfDelete

Posté : dim. 27 janv. 2008 19:38
par eln
Bonjour

Utilisateur du script SelfDelete découvert grâce à Tlem, je me suis aperçu qu'il ne remplissait pas ses fonctions dés qu'un utilisateur où le titre du script avait un accent. J'ai réussi à contourner ce problème avec quelques modifications.

Code original :

Code : Tout sélectionner

_SelfDelete()

Func _SelfDelete ( $iDelay = 0 )
Local $sCmdFile
FileDelete ( @TempDir & "\scratch.bat" )
$sCmdFile = 'ping - n ' & $iDelay & '127.0.0.1 > nul' & @CRLF _
& ':loop' & @CRLF _
& 'del "' & @ScriptFullPath & '"' & @CRLF _
& 'if exist "' & @ScriptFullPath & '" goto loop' & @CRLF _
& 'del ' & @TempDir & '\scratch.bat'
FileWrite ( @TempDir & "\scratch.bat" , $sCmdFile )
Run ( @TempDir & "\scratch.bat" , @TempDir , @SW_HIDE )
EndFunc
Code modifié :

Code : Tout sélectionner

#include <Process.au3>  ;Commande _RunDOS

SelfDelete()

Func SelfDelete($iDelay = 0)
    _RunDOS("echo " & @ScriptFullPath & ">" & @TempDir & "\Chemin_Appli.txt")
    $Chemin_Appli = FileOpen(@TempDir & "\Chemin_Appli.txt", 0)
    Local $sCmdFile
    FileDelete(@TempDir & "\scratch.bat")
    $sCmdFile = 'ping -n ' & $iDelay & '127.0.0.1 > nul' & @CRLF _
             & ':loop' & @CRLF _
             & 'del "' & FileReadLine($Chemin_Appli, 1) & '"' & @CRLF _
             & 'if exist "' & FileReadLine($Chemin_Appli, 1) & '" goto loop' & @CRLF _
             & 'del ' & @TempDir & '\scratch.bat'
    FileWrite(@TempDir & "\scratch.bat", $sCmdFile)
    FileClose($Chemin_Appli)
    FileDelete(@TempDir & "\Chemin_Appli.txt")
    Run(@TempDir & "\scratch.bat", @TempDir, @SW_HIDE)
EndFunc   ;==>SelfDelete

Re: [Ex] SelfDelete

Posté : dim. 27 janv. 2008 21:00
par Tlem
eln a écrit :Utilisateur du script SelfDelete découvert grâce à Tlem
Merci.
eln a écrit :je me suis aperçu qu'il ne remplissait pas ses fonctions dés qu'un utilisateur où le titre du script avait un accent.
Autant pour moi, je n'avais pas pensé à ça.
Mais qu'a cela ne tienne ... Il suffit donc de récupérer le chemin + nom de fichier court.
Et pour cela, une fonction toute faite existe : FileGetShortName
Il suffit donc de modifier la fonction comme si dessous, pour que ca fonctionne :

Code : Tout sélectionner

Func _SelfDelete($iDelay = 0)
    Local $sCmdFile
    FileDelete(@TempDir & "\scratch.bat")
    $sCmdFile = 'ping - n ' & $iDelay & '127.0.0.1 > nul' & @CRLF _
             & ':loop' & @CRLF _
             & 'del "' & FileGetShortName (@ScriptFullPath) & '"' & @CRLF _
             & 'if exist "' & FileGetShortName (@ScriptFullPath) & '" goto loop' & @CRLF _
             & 'del ' & @TempDir & '\scratch.bat'
    FileWrite(@TempDir & "\scratch.bat", $sCmdFile)
    Run(@TempDir & "\scratch.bat", @TempDir, @SW_HIDE)
EndFunc

Re: [Func] SelfDelete

Posté : ven. 02 avr. 2010 22:17
par Tlem
Voici une version plus simple (origine du forum Allemand) proposée par SagePourpre, dont j'ai amélioré le fonctionnement pour prendre en charge le nom des fichiers long.

Code : Tout sélectionner

Func _SelfDelete ($num = 1)
    If @Compiled Then Exit ShellExecute ( @ComSpec , " /c ping 127.0.0.1 -n " & $num & " & DEL /F " & FileGetShortName(@ScriptName) , @ScriptDir , "open" , @SW_HIDE )
EndFunc
J'ai même profité pour rajouter le commutateur /F à la commande DEL car si le fichier est en lecture seul, il ne peut s'autodétruire. ;)

Re: [Func] SelfDelete

Posté : sam. 03 avr. 2010 02:40
par SagePourpre
La fonction est même plus simple que les crédits qui l'accompagnent...

Tu sais, la fonction _SelfDelete provenant du forum allemand proposée en remplacement par SagePourpre que TLEM
a amélioré en y intégrant la prise en charge des noms de fichier longs.

Re: [Func] SelfDelete

Posté : mer. 12 mai 2010 11:04
par softwater
Bonjour,

J'ai testé avec succès la fonction _selfDelete(). Par contre je ne comprends pas à quoi sert le ping sur localhost?

Quelqu'un aurait-il l'amabilité de m'éclairer, d'autant que cela fonctionne aussi sans !
Merci.

Code : Tout sélectionner

Func _SelfDelete ()
    If @Compiled Then Exit ShellExecute ( @ComSpec , " /c DEL /F " & FileGetShortName(@ScriptName) , @ScriptDir , "open" , @SW_HIDE )
EndFunc

Re: [Func] SelfDelete

Posté : mer. 12 mai 2010 11:17
par scorp84
Bonjour softwater,

Le ping permet de mettre une tempo paramétrable ($iDelay) avant d'exécuter la suite de la fonction.

Amicalement.

BM

Re: [Func] SelfDelete

Posté : mer. 12 mai 2010 11:23
par softwater
Donc si j'ai bien compris ça fait un "Sleep" au niveau de la console DOS histoire que l'exe ait le temps de se fermer.
Merci pour la réponse.