fred08155
Goto Top

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?

Content-ID: 238074

Url: https://administrator.de/contentid/238074

Ausgedruckt am: 22.11.2024 um 16:11 Uhr

Xaero1982
Xaero1982 14.05.2014 um 22:27:14 Uhr
Goto Top
Hi,

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ß
rubberman
rubberman 14.05.2014 um 22:27:59 Uhr
Goto Top
Hallo fred08155, willkommen im Forum.

Vermutlich ist das Verzeichnis in Benutzung, da es das Arbeitsverzeichnis der "Lösch-Batch" Datei ist (geerbt von der "Deinstall-Batch" Datei). Leider hast du keinerlei Code gepostet. Wie wird denn dein "Lösch-Batch" aufgerufen?

Grüße
rubberman
Xaero1982
Xaero1982 14.05.2014 um 23:57:03 Uhr
Goto Top
Rubberman, die Datei wird offensichtlich aufgerufen, da der Inhalt ja gelöscht wird und ein leeres Verzeichnis zurück bleibt.

Gruß
rubberman
Lösung rubberman 15.05.2014 aktualisiert um 22:05:16 Uhr
Goto Top
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!!!
@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"  
Noch einfacher geht es ohne temporäre Datei, aber auch hier muss das Arbeitsverzeichnis vorher gewechselt werden.
@echo off &setlocal
cd /d "%temp%"  
rd /s /q "%~dp0"  


Grüße
rubberman
fred08155
fred08155 15.05.2014 um 12:23:20 Uhr
Goto Top
Das mit dem Arbeitsverzeichnis wirds wohl sein. Werds gleich später ausprobieren, wenn ich wieder an dem Rechner sitze.
Aufgerufen wird der Batch ganz simpel mit
start %temp%\deinstall.bat

Dann kann ich mir auch den Umweg über den Batch sparen. Hatte noch ein zusätzliches Gimmick eingebaut. Damit man von der Deinstallation nix sieht hatte ich ein weiteres VB-Skript aus dem Internet kopiert, welches den Batch als unsichtbares Fenster startet (wird auch ins Temp-Verzeichnis geschrieben und löscht sich dann auch wieder selbst nach der Ausführung).
Hab mittlerweile aber auch gelesen, wie man direkt mit dem VB-Skript Dateien und Ordner löscht.
Dann sinds da nur zwei Zeilen mehr und gut is.
fred08155
fred08155 15.05.2014 um 22:06:00 Uhr
Goto Top
Super. Hat geklappt. Danke für den Tipp.