Batch Programmierung - Child Prozess mit rmdir -s -q hinterlässt leeren Ordner
Hallo
Ich hab mir etwas im Kommandozeile (Batch) programmiert.
Das Programm läuft super. Um es noch etwas anwendungsfreundlicher zu machen, habe ich einen "Installer" (kopiert das Programm rüber und erstellt eine Verknüpfung [über ein VB-Skript]) und einen "Deinstaller" erstellt.
Beim Deinstallationsbatch habe ich aber ein Problem.
Der Batch schreibt über echo einen weiteren Batch ins temporäre Verzeichnis, der den Installationsordner und die Verknüpfung löschen soll und sich am Ende dann selbst vernichtet.
Allerdings hinterlässt mir dieser Batch einen leeren Installationsordner. Ich kann mir nicht erklären, warum das so ist.
Der Befehl ist OK und wenn ich den Batch separat ausführe funktioniert er auch und löscht das Verzeichnis komplett weg.
Ist das irgendeine Art Rechteproblem oder sowas?
Wie kann ich das umgehen bzw beheben, ohne einen unnötig hohen Aufwand zu treiben?
Nochmal zur Verdeutlichung... der Deinstall-Batch schreibt einen Batch ins temporäre Verzeichnis. Darin ist der Befehl rd /s /q "%installationspfad%" enthalten.
Der Pfad wird als Variable aus einer INI Datei ausgelesen, die das Hauptprogramm erstellt bzw ändert. Jedes Mal beim Programmstart wird das Verzeichnis abgefragt und in der INI abgespeichert (zwecks Auto-Update-Funktion und Deinstallation).
Das dürfte mit dem eigendlichen Problem aber nichts zu tun haben. Auch mit direkt ausformuliertem Pfad tritt das Problem auf.
Nach dem starten des Lösch-Batch im temporären Ordner beendet sich der Deinstall-Batch sofort.
Ich hab auch schon ein Timeout mit bis zu 10 Sekunden in den Lösch-Batch eingebaut der den eigendlichen Löschvorgang hinauszögert, aber das hat auch nichts gebracht.
Auch das mehrfache ausführen des Löschbefehls im Lösch-Batch oder eine Schleife mit "if exist" bringt nix, ausser daß der Batch bei letzterem dann natürlich ewig läuft.
Wo liegt hier der Fehler?
Ich hab mir etwas im Kommandozeile (Batch) programmiert.
Das Programm läuft super. Um es noch etwas anwendungsfreundlicher zu machen, habe ich einen "Installer" (kopiert das Programm rüber und erstellt eine Verknüpfung [über ein VB-Skript]) und einen "Deinstaller" erstellt.
Beim Deinstallationsbatch habe ich aber ein Problem.
Der Batch schreibt über echo einen weiteren Batch ins temporäre Verzeichnis, der den Installationsordner und die Verknüpfung löschen soll und sich am Ende dann selbst vernichtet.
Allerdings hinterlässt mir dieser Batch einen leeren Installationsordner. Ich kann mir nicht erklären, warum das so ist.
Der Befehl ist OK und wenn ich den Batch separat ausführe funktioniert er auch und löscht das Verzeichnis komplett weg.
Ist das irgendeine Art Rechteproblem oder sowas?
Wie kann ich das umgehen bzw beheben, ohne einen unnötig hohen Aufwand zu treiben?
Nochmal zur Verdeutlichung... der Deinstall-Batch schreibt einen Batch ins temporäre Verzeichnis. Darin ist der Befehl rd /s /q "%installationspfad%" enthalten.
Der Pfad wird als Variable aus einer INI Datei ausgelesen, die das Hauptprogramm erstellt bzw ändert. Jedes Mal beim Programmstart wird das Verzeichnis abgefragt und in der INI abgespeichert (zwecks Auto-Update-Funktion und Deinstallation).
Das dürfte mit dem eigendlichen Problem aber nichts zu tun haben. Auch mit direkt ausformuliertem Pfad tritt das Problem auf.
Nach dem starten des Lösch-Batch im temporären Ordner beendet sich der Deinstall-Batch sofort.
Ich hab auch schon ein Timeout mit bis zu 10 Sekunden in den Lösch-Batch eingebaut der den eigendlichen Löschvorgang hinauszögert, aber das hat auch nichts gebracht.
Auch das mehrfache ausführen des Löschbefehls im Lösch-Batch oder eine Schleife mit "if exist" bringt nix, ausser daß der Batch bei letzterem dann natürlich ewig läuft.
Wo liegt hier der Fehler?
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 238074
Url: https://administrator.de/contentid/238074
Ausgedruckt am: 22.11.2024 um 16:11 Uhr
6 Kommentare
Neuester Kommentar
Hi,
also ich hab mal was gebastelt:
Das funktioniert bei mir problemlos. Ordner weg und uninstaller.bat ist auch weg.
Daher ist es schwer nachvollziehbar warum es bei dir nicht funktioniert.
Ist der Ablauf bei dir auch so im Grunde?
Gruß
also ich hab mal was gebastelt:
@echo off
md %temp%\install
copy program.bat %temp%\install\*.*
echo rd /s /q "%temp%\install\" >>%temp%\uninstaller.bat
echo del %temp%\uninstaller.bat >>%temp%\uninstaller.bat
start %temp%\uninstaller.bat
exit
Das funktioniert bei mir problemlos. Ordner weg und uninstaller.bat ist auch weg.
Daher ist es schwer nachvollziehbar warum es bei dir nicht funktioniert.
Ist der Ablauf bei dir auch so im Grunde?
Gruß
Das habe ich nicht in Abrede gestellt. Sollte aber das Arbeitsverzeichnis nicht gewechselt werden, bleibt das Verzeichnis in Benutzung und kann nicht gelöscht werden.
Achtung diese Codes löschen das Verzeichnis in dem sie liegen!!!
Noch einfacher geht es ohne temporäre Datei, aber auch hier muss das Arbeitsverzeichnis vorher gewechselt werden.
Grüße
rubberman
Achtung diese Codes löschen das Verzeichnis in dem sie liegen!!!
@echo off &setlocal
>"%temp%\removedir.bat" echo @rd /s /q "%~dp0" ^& del "%%~f0"
:: Funktioniert nicht, da "removedir.bat" im selben Arbeitsverzeichnis ausgefüht wird, in dem dieser Batchcode liegt (wurde vererbt), auch wenn die Datei selbst in %temp% liegt:
:: start "" cmd /c "%temp%\removedir.bat"
:: Funktioniert, weil durch die Option /D das Arbeitsverzeichnis gewechselt wird:
start "" /d "%temp%" cmd /c "%temp%\removedir.bat"
@echo off &setlocal
cd /d "%temp%"
rd /s /q "%~dp0"
Grüße
rubberman