Exe die batch erstellt, die exe und sich selbst löscht
hallo erstmal
ich versuch jetzt schon stundenlang eine batch datei zu schreiben, welche ich später zu exe umwandel, welche folgenden plan erfüllt
1. die exe datei zeigt einen text an
2. die exe datei erstellt eine batch datei
3. die exe datei öffnet die batch datei und schließt sich
4. die erstellte batch datei löscht die exe datei
5. die batch datei löscht sich selbst
die exe heißt hallo.exe
un die batch datei heißt new.bat
die batch datei sollte die exe finden egal wo sie ist.
hier is mein bisheriges ergebnis
Code:
@echo off
:informationen
echo hallo
pause
:new batch
cls
echo>>new.bat @echo off
echo>>new.bat cls
echo>>new.bat @for %%i in ("hallo.exe" ) do @del /q "%%i"
echo>>new.bat del /s /f /q new.bat
new.bat
Also da die "exe" ja die "bat" erstellt, kann sie dieser ganz leicht sagen wo sie selbst (also die "exe") ist (also ist da nicht wirklich eine Suche notwendig). Um eine Bat sich selbst löschen zu lassen genügt ein "del %0" (%0 -> enthält den Name mit der die Bat aufgerufen wurde).
Du müsstest mal sagen, wie dein BAT2EXE tickt, sonst wird es eh' schwierig, die EXE zu löschen.
Code:
del /s /f /q new.bat
besser:
Code:
del /s /f \new.bat >nul 2>&1
.. und damit hast du noch nicht alle LW erfasst, was auch nicht so einfach ist.
/f betrifft den Schreibschutz von new.bat, falls du den aktivierst.
Zur Ausgabe an eine Datei müssen Sonderzeichen escaped werden: ^>
Um was in eine Datei zu schreiben:
Code:
echo something and more >> new.bat
echo my big command ^> infile >> new.bat
Da aber diese erste "bat" eh zu einer "exe" werden soll ist der obere Code etwas unnötig und man sollte sich auch nicht zu lange damit aufhalten, diesen auszubessern ...
Hier ist eine Referenzimplementierung in C von mir ... die erstellte "bat" heißt bei mir jedoch genau so wie die "exe" nur mit ".bat" angehängt und befindet sich immer im gleichen Ordner wie die "exe" (es ist wichtig dass die "exe" aufgerufen wird und nicht eine Verknüpfung davon, da sonst die Verknüpfung gelöscht wird)
Code:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void doSomething()
{
// Darunter könnte ihr Code stehen ...
// Darüber könnte ihr Code stehen ...
}
char* getBatName(char const *name)
{
/*
* Erstelle genügend Speicher für den kompletten Pfad und Namen von diesem
* Programm + ".bat" ('\0' kommt auch dazu)
*
* argv[0] enthält den kompletten Pfad von diesem Programm (+ Dateiname)
*/
char *batName = (char*) malloc(strlen(name)+5);
if(batName == NULL)
{
/*
* konnte keinen speicher bereitstellen
*/
perror("ERROR (malloc)");
return NULL;
}
/*
* neuen Dateinamen für die "*.bat" basteln.
* Voller Pfad von diesem Programm (+ Dateiname) und anhängen von ".bat"
*/
strcpy(batName, name);
strcat(batName, ".bat");
return batName;
}
// gibt Verantwortung über Speicher des "*.bat"-Namen an den Aufrufer weiter.
char* createBat(char const *name)
{
char *batName = getBatName(name);
if(batName == NULL)
{
/*
* konnte Datei Namen für "*.bat" nicht erzeugen
*/
return NULL;
}
FILE *pFile = fopen(batName, "w");
if(pFile == NULL)
{
/*
* konnte Datei nicht öffnen
*/
perror("ERROR (fopen)");
return NULL;
}
/*
* neue "*.bat" erstellen.
* löscht zuerst die "*.exe" (den Ersteller, dieses Programm) und danach
* sich selbst (die hier erstellte "*.bat").
*
* !!! Wichtig !!!!
* Beim löschen von sich selbst, wird "gleichzeitig" "exit 0" ausgeführt, da
* durch "start" (siehe execCommand) eine neue "cmd" gestartet wird und
* durch das löschen der Befehl danach nicht mehr ausführbar wäre.
*/
fputs("@echo off\n"
"del ", pFile);
fputs(name, pFile);
fputs("\n"
"del %0 && exit 0", pFile);
fclose(pFile);
// gibt Verantwortung über Speicher des "*.bat"-Namen an den Aufrufer weiter
return batName;
}
int execBat(char const *name)
{
/*
* Erstelle genügend Speicher für "start " + den kompletten Pfad und Namen
* von der "*.bat" ('\0' kommt auch dazu)
*
* "start [name]"
*/
char *execCommand = (char*) malloc(strlen(name)+8);
if(execCommand == NULL)
{
/*
* konnte keinen speicher bereitstellen
*/
perror("ERROR (malloc)");
return -1;
}
/*
* Befehl zu starten (erstellt eine neue "cmd") der "*.bat".
* "start " + Voller Pfad von diesem Programm (+ Dateiname) und anhängen von ".bat"
*/
strcpy(execCommand, "start ");
strcat(execCommand, name);
// "start [name]" ausführen
system(execCommand);
free(execCommand);
return 0;
}
int main(int argc, char const *argv[])
{
/*
* In die Funktion sollte noch Code rein ...
* z.B. das anzeigen eines Textes ...
*/
doSomething();
/*
* "*.bat" erstellen.
* bekomme verantwortung für Speicher im Rückgabewert.
*/
char *batName = createBat(argv[0]);
if(batName == NULL)
{
// konnte "*.bat" nicht erstellen
return -1;
}
if(execBat(batName) != 0)
{
// konnte "*.bat" nicht ausführen
return -2;
}
free(batName);
return 0;
}
Ja, bitte nicht falsch verstehen ... ich wollte die Lösung nicht schlecht machen ... ich weiß halt nur nicht warum man sich mit einem Batch-Programm "quält", wenn es ja am ende doch eine "exe" daraus werden soll und kein Skript.
Das C-Programm soll ja auch nur als ein Beispiel für viele herhalten ... Grundsätzlich funktioniert das gewünschte Programm so:
"Creator":
Pfad von "Creator" herausfinden
"Deleter" erstellen (Übergabe von Pfad des "Creators"
"Deleter" ausführen (unabhängig vom "Creator" und gleichzeitig "Creator" beenden)
"Deleter":
"Creator"-Pfad erhalten
Pfad von "Deleter" herausfinden
"Creator" löschen
"Deleter" löschen (muss wahrscheinlich gleichzeitig mit dem beenden von "Deleter" passieren)
Man könnte/sollte den "Deleter" so erstellen, dass er so lange mit dem löschen von "Creator" wartet, bis sich "Creator" beendet hat (sonnst muss man den "Creator" gleich nach dem Start von "Deleter" beenden), da sonst ein Löschen nicht möglich ist.