selfdelete - ohne Batch-Datei

  • Hi,

    der Zweck sei mal egal, aber ich ne Funktion geschrieben, die sich selbst löscht ohne zusätzliche batch oder änhliches.

    [autoit]


    Func _selfdelete()
    ShellExecute(@ComSpec," /c ping 127.0.0.1 -n 1 & del " & @ScriptName,@ScriptDir,"open",@SW_HIDE)
    Exit
    EndFunc

    [/autoit]

    Zur Erklärung:
    Per Shellexec wird die Cmd aufgerufen.
    Dann wird mit ping 127.0.0.1 Lokalhost gepingt.
    Dies kann man als quasi-Pause benutzen, die Windows sonst nicht kennt.
    Das einmalige Pingen von Lokalhost dauert ca. 1 sek.
    der Parameter bestimmt wie oft Lokalhost gepingt wird (hier einmal).
    Für größere Scripts am besten erhöhen, denn dies gibt dem Programm die Zeit fürs Exit, da unser Programm nicht auf die Ausführung (und Beendung) des per Shellexec gestarteten Programms wartet.
    Mittels des kaufmänischen Unds (&) werden in der CMD mehrere Befehle miteinander verkettet.
    In diesem Fall folgt auf das warten die Löschung unseres Programms (del @scriptfullpath).
    Viel Spaß, ich kann die Funktion gebrauchen ;)

    Grüße

    SlowlyDead

  • Sehr gute Idee! :thumbup:

    Hier noch einige Verbesserungsvorschläge:
    Verwende @ScriptName anstelle von @ScriptFullPath, sonst funktioniert es nicht.
    Verwende eine unbekannte IP-Adresse um den Parameter w wirksam werden zu lassen und die Wartezeit einstellbar zu machen.

    Spoiler anzeigen
    [autoit]

    Func _selfdelete($iWait = 1000) ;wait 1000ms as default
    ShellExecute(@ComSpec, "/c ping 0.0.0.1 -n 1 -w " & $iWait & " & del " & @ScriptName, @ScriptDir, "open", @SW_HIDE)
    EndFunc

    [/autoit]
  • Stimmt, -w ist noch ne gute Idee.
    @ScriptFullPath (win7, xp teste ich die Tage) funktionierte bei mir, muss ich mir nochmal genauer ansehen ;)
    Du benötigst aber nach dem Shellexec noch ein Exit, weil das Programm nur gelöscht werden kann wenn es nicht läuft, deswegen ja der Ping als Pause.

    Grüße

    SlowlyDead

  • Absolut geil...

    Hat nur bei mir nie funktioniert bis ich folgende änderung gemacht habe...

    [autoit]


    _selfdelete()

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

    Func _selfdelete($iWait = 1000) ;wait 1000ms as default
    ShellExecute(@ComSpec, '/c ping 0.0.0.1 -n 1 -w ' & $iWait & ' & del "' & @ScriptFullPath & '"', @ScriptDir, 'open', @SW_HIDE)
    Exit
    EndFunc

    [/autoit]

    Einmal editiert, zuletzt von Mr_gitarre (26. Oktober 2010 um 05:57)