Selbstlöschung des Scripts in einer Zeile.

  • Hallo zusammen,

    ich hatte das Problem, daß ich meinen kompilierten Skript per Parameter löschen wollte und Dirremove natürlich den Dienst versagte, weil der Script selbst ja noch geöffnet war.

    Ich hatte hier im Forum die Anregung gefunden, das Ganze über eine Batchdatei zu machen, die temporär abgelegt würde.

    Als alter Bat Veteran hab ich das Ganze dann natürlich noch ein Wenig optimiert, daß jetzt gar keine Batchdatei mehr nötig ist:

    [autoit]

    Run(@ComSpec & " /c " & 'ping 127.0.0.1 -n 4 >nul & rmdir /s /q ' & @ScriptDir, @WindowsDir, @SW_HIDE)

    [/autoit]

    Der Ping auf das internal Loopback sorgt für eine Zeitverzögerung von etwa 4 Sekunden, wenn dies der letzte Befehl im Skript ist reicht das eigentlich. Anschliessend wird RMDIR mit dem aktuellen Scriptdirectory aufgerufen. "@Windir" ist das Workingdirectory der CMD, welches ohne Angabe dasselbe wäre wie @Scriptdir, womit wieder ein Prozess ein Bein im Verzeichnis hätte. @SW_HIDE ist ja klar...

    Prima, keine externe Datei, wie temporär auch immer, kein include...


    Vielleicht könnt Ihr ja was damit anfangen...


    GrüüüÜÜÜüüüße, Goink

  • Oscar : Das ist auch die Intention dahinter, daß das gesamte Projektverzeichnis gelöscht wird. Die Registrykeys und den ganzen Rott bin ich ja vorher schon losgeworden. Natürlich wird auch überprüft, ob das Programm per Installroutine dort gelandet ist.

    In Gänze baue ich grade zwei Funktionen, die ich in meine zukünfitigen Skripte integrieren kann.
    tollprog.exe /install Installiert das Programm nach @programdir\Projektname und trägt das Ganze in der Registry unter Uninstall ein, sodaß man es in der Systemsteuerung unter "Software" sieht, und deinstallieren kann.

    @ slowly dead: Oha, ich hatts nicht direkt gefunden, sondern nur die "Mehrzeiler"

    stayawayknight:
    Es geht darum, das komplette Verzeichnis zu löschen. Das geht nicht, wenn es noch einen Prozess gibt, der dort sein Workingdir hat. In diesem Falle eben das Skript selbst.

    Grüße, Goink

    Einmal editiert, zuletzt von Goink (30. August 2010 um 18:36)

  • da muss ich oscar recht geben.

    der programmierer sollte ja wissen, was er alles installiert und nur diese dateien löschen (kann man ja im vorfeld machen). und die selfdelete-func gilt dann nur für das script selber.

    ich hatte auch mal so ein schlecht programmiertes tool, was mir ein haufen arbeit gemacht hat, das es ebenfalls diese löschroutine hatte und mir eine ganze reihe an dokumenten gelöscht hat. eigentlich zeigt das nur die faulheit der programmierer auf kosten unwissentlicher user.

  • sc4ry wie ich oben schon geschrieben habe, ist der ganze restliche Kram bereits entfernt.


    Der Einzeiler ist nur das Nebenprodukt eines größeren Projekts, welches den Rahmen sprengen würde...

    Im Vorfeld laufen noch einige Prüfungen, ob das Verzeichnis, welches gelöscht werden soll, auch tatsächlich das Verzeichnis ist, das von der Installroutine angelegt wurde. Auslesen des beim Install angelegten Regkeys mit dem Programmpfad. Ist dieser gleich mit @ScriptDir, kann ich im Einzeiler auch @ScriptDir nehmen (weils ja gleich ist).

    Die Prüfung, ob das Verzeichnis bis auf den Script selber leer ist, erfolgt auch im Vorfeld.

    NUR DANN wird der Einzeiler ausgeführt.

    [autoit]

    Func Uninstall()
    If @compiled Then
    DIM $Uninstpath = RegRead($UninstKey,'UninstallString')
    DIM $Instlog = RegRead($InstLogKey,'InstLog')
    If _emptyProgDir($Instlog) = 0 Then
    $Uninstpath = Stringleft($Uninstpath,Stringinstr($Uninstpath,"\" & @Scriptname)-1) & '"'
    If $Uninstpath = '"' & @Scriptdir & '"' Then
    If Msgbox (3,@Scriptname,"Soll das Programm " & $Projectname & " deinstalliert werden?") = 6 Then

    [/autoit][autoit][/autoit][autoit]

    RegDelete($SettingsKey)
    RegDelete($UninstKey)

    [/autoit][autoit][/autoit][autoit]

    Msgbox(0,@Scriptname, '"' & $Projectname & '"' & " wurde erfolgreich deinstalliert.",15)
    Run(@ComSpec & " /c " & 'ping 127.0.0.1 -n 4 >nul & rmdir /s /q ' & @ScriptDir, @WindowsDir, @SW_HIDE)
    Else

    [/autoit][autoit][/autoit][autoit]

    endif
    Else
    msgbox(0,@Scriptname,"Bitte führen Sie die Deinstallation über die Systemsteuerung aus.",20)
    endif
    Else
    msgbox(0,@Scriptname,"Deinstallation nur bei kompilierten Programmen möglich, nicht bei .au3 Skripten",20)
    Endif
    Else
    Msgbox(0,@Scriptname,"Deinstallation nicht möglich, es liegen noch Daten im Programmverzeichnis: " & @crlf & @scriptdir)
    EndIf
    Exit
    EndFunc

    [/autoit]


    Wenn die Selfdelete Funktion nur den Script selbst löscht, bleibt (mal wieder) ein leeres Verzeichnis im Programfolder zurück. Eine saubere Deinstallation ist das nicht....


    Grüße, Goink


    PS: Das mit dem Einrücken im Quelltext scheint nicht zu gehen, oder?