Batch CMD - Zweite Konsole öffnen, erste automatisch schließen

Manaplayer

Cadet 4th Year
Registriert
Juni 2017
Beiträge
89
Hallöchen Leute,
Wie der Betreff schon sagt - Ich hab als Test sowas vor:

cd /d z:\daten\test
set bla=z:\daten\test
cmd /c timeout /t 2&rd /s /q %bla%
exit

Die erste Konsole hält den Ordner davon ab gelöscht zu werden (Kommt ja die Nachricht, wird vom Prozess verwendet)
Passiert mit Absicht jetzt nur zum Test, bei einer echten Sache passiert das aber immer so.
Mit "Bat to Exe" bleiben unzählige -temp ordner über, und die soll eine zweite Konsole löschen, wenn die erste Hauptkonsole seit 2 Sekunden automatisch geschlossen ist.
Nur das Problem ist, daß die Hauptkonsole darauf wartet, daß die zweite ihren Job gemacht hat und geht erst dann zu exit. So löscht sich der Ordner schliesslich nicht.
Hat einer eine Idee?
 
In welchem Ordner befinden sich denn die "Bat"? Wenn die im gleichen Ordner ist, der geloescht werden soll, geht das Ordner loeschen nicht.

Das BAT2EXE Muell ueberlaesst ist richtig. Die eingebettete Bat wird ja jedesmal entpackt, temporaer gespeichert und dann ausgefuehrt.

Loesungsansatz:

- Bau das was die Batch macht mit was anderem.
- Wenn W10, lass das einfach automatisch aufraeumen.

BFF
 
Ja der Ordner wo die Bat ist, soll automatisch gelöscht werden durch die zweite Konsole, wenn die erste geschlossen ist.
Daß der Ordner solange nicht gelöscht wird solange die Bat noch am laufen ist, ist mir klar. Deswegen soll eine zweite Konsole sich darum kümmern und solange warten bis die erste geschlossen ist.
So soll es automatisch passieren daß kein Müll überbleibt um den ich mich kümmern muss.
 
Erschlag mich, aber die 2. CMD muss erst beendet werden damit die aufrufende erste enden kann.
«Sich selbst Löschen» ist schon ewig ein afaik unlösbares Problem.

CN8
 
Dann schau, wo die zweite "Konsole" ihre Daten ablegt.
Wenn das aus einer BAT2EXE kommt, ist es sicherlich auch der Ordner den Du gerade loeschen willst.

Worum geht es eigentlich? Es stoert Dich nur, dass BAT2EXE temporaere Dateien hinterlaesst?
Geht es um Deinen PC oder um ein "Spielzeug" das Du per Batch rennen laesst?

BFF
Ergänzung ()

@cumulonimbus8

Wenn man schon solche Spaesse wie CMD per BAT2EXE staendig benutzt, baut man sich auch seit XP einen Geplanten Task, der den temporaeren Muell weg loescht. Mittlerweile macht das Windows von ganz allein, vorausgesetzt man laesst es. :-)

BFF
 
Vielleicht hab ich beim erklären irgendwas falsch geschrieben.
Also, die 1. Batch ist die "Hauptbatch" vom Bat2Exe.
Die 2. Batch (Da vielleicht falsch erklärt, soll keine Datei sein, sondern nur die zweite Befehlkonsole) soll dann von der ersten gestartet werden, die dann den Ordner der 1. Batch löscht, während der 1. Batch schon beendet ist.
Ich hab schon etwas weiter experimentiert. So würde es funktionieren, wenn der zweite Befehl auch übernommen werden würde:

cd /d Z:\DATEN\test
start "cmd" cmd timeout /t 2 & rd /s /q Z:\DATEN\test
exit

Wärend der zweite gestartete Konsole noch auf ihr timeout wartet, ist die Hauptbatch schon beendet und könnte so den Ordner löschen. Nur übernimmt die zweite Konsole nur den ersten Befehl
 
Experimentiere mal mit den Schaltern /K und /C.
https://stackoverflow.com/questions/9392874/bat-file-open-new-cmd-window-and-enter-code-in-there

Was willst Du in dem Ordner Z:\Daten\test? Wenn Du da drin bist nach dem CD kannst Du den Ordner nicht loeschen.

2018-08-05 18_28_49-Window.png


Schoen zu sehen im Bild.

Vielleicht waere es einfacher Dir zu helfen, wenn man wuesste was Du ueberhaupt machen willst.

BFF
 
@ Manaplayer
der cd-Befehl blockiert den Ordner. Einfach weglassen und dann klappt es auch:
Code:
@echo off
set bla=z:\daten\test
cmd /c timeout /t 2&rd /s /q %bla%
exit

oder mit cd einen Ordner wieder höher gehen (sprich : aus dem zu löschenden Ordner wieder rausgehen):
Code:
@echo off
cd /d E:\daten\test
set bla=E:\daten\test
cmd /c timeout /t 2
cd E:\daten
rd /s /q %bla%
exit
 
Den Ordner "festhalten" in der Hauptbatch war ja nur als "Test", ob das "Experiment" funktioniert. Daß es ohne "festhalten" funktioniert mit löschen ist mir klar. Es geht ja darum daß im fertigen Batch später der Befehl dann im Hauptbatch reinkommt, und die zweite Konsole öffnen soll. Erstmal muss ich dafür wissen wie man "Start cmd "Befehl1" "Befehl2"" richtig schreibt, da nur bisher der erste Befehl ausgeführt wird.
Ergänzung ()

Also nochmal erklärt:

(Konsole1=Hauptbatch. Diese läuft alleine durch die Batchdatei in einem tempörären Ordner)
cd /d Z:\DATEN\test
(Das ist nur als Test gedacht den Ordner durch die Hauptbatch "festzuhalten", um zu sehen ob die Hauptbatch noch läuft oder nicht, während die zweite Konsole ihren Befehl ausführt)

start "cmd" cmd timeout /t 2 & rd /s /q Z:\DATEN\test
(Hiermit wird Konsole2 gestartet die 2 Sekunden wartet, während die Hauptkonsole sich schließt, damit Konsole2 den Ordner, in der sich die Batchdatei befindet dann löschen kann)

exit
 
Zuletzt bearbeitet:
Auch wenn es auf verschiedene .bat aufgeteilt ist, so muß dennoch der zu löschende Ordner wieder freigegeben werden (mit einem CD-Befehl wieder verlassen oder die CD-Zeile komplett weglassen):

Beide Dateien liegen auf dem Desktop:
1.bat (die "Haupt-Batch"):
Code:
@echo off
cd /d E:\daten\test
set bla=E:\daten\test
echo "mache irgendwas richtig kompliziertes. schwer zu erklaeren."
cmd /c timeout /t 5
cd "E:\daten"
call "C:\Users\Dein_Benutzername\Desktop\2.bat"
EXIT

2.bat (die andere Batch):
Code:
@echo off
set bla=e:\daten\test
cmd /c timeout /t 10
rd /s /q %bla%
exit




Man könnte es natürlich auch so machen, daß es eine Hauptbatch gibt (0.bat), welche zwei Unter-Batch startet (1.bat und 2.bat).

2.bat prüft, ob eine bestimmte, temporäre Datei vorliegt (in dem Beispiel : BLOCK.txt). Solange diese existiert, wird darauf gewartet, daß diese von 1.bat letztendlich gelöscht wird. Gelöscht wird diese erst, sobald 1.bat durchgelaufen ist.

0.bat
Code:
@echo off
start 1.bat
start 2.bat
Exit

1.bat
Code:
@echo off
del /F /Q E:\daten\test\BLOCK.txt
echo BlahBlahBlah > E:\daten\test\BLOCK.txt
echo "mache irgendwas richtig kompliziertes. schwer zu erklaeren."
cmd /c timeout /t 5
cd "E:\daten"
del /F /Q E:\daten\test\BLOCK.txt
EXIT

2.bat
Code:
@echo off
ping 127.0.0.1

:ANFANG
if exist "E:\daten\test\BLOCK.txt" (
REM Datei existiert
GOTO ANFANG

) else (
REM Datei existiert NICHT
rd /s /q "E:\daten\test"
EXIT
)
 
Zuletzt bearbeitet:
Hm, danke, aber so würde ja wieder "Müll" überbleiben - Die 2.Bat. Mir geht es nur darum daß ich ein möglichst übersichtliches Dateisystem behalte, da ich viel in dem Temp-Ordner mache.
Wie schon geschrieben, ist die Konsole2, oder auch "zweite Batch" keine Datei, sondern nur von der ersten Batch ein zweites Eingabeaufforderung-Fenster, daß dann den Ordner löschen wird. Würde klappen wenn es funktionieren würde den START-Befehl richtig hinbekommen würde:

start "cmd" cmd timeout /t 2 & rd /s /q Z:\DATEN\test

Wie geschrieben, führt er aber nur den ersten Befehl aus
 
Dann mache einen Task, welcher regelmäßig den TEMP-Ordner löscht.
Die Datei macht das Kraut echt fett.

Evtl. ist autoit etwas für dich. Über diese Zusatzdatei können Skripte geschrieben werden, welche sich selbst löschen

Code:
#include <MsgBoxConstants.au3>
#include '_SelfDelete.au3'

;irgendwas machen
msgbox(0,"","test")

_SelfDelete(1, 0) ; Start the SelfDelete batch file with a 5 second timer and using the prcocess name rather than the PID.
If @error Then
    Exit MsgBox($MB_SYSTEMMODAL, '_SelfDelete()', 'The script must be a compiled exe to work correctly.') ; Display a warning if the script isn't compiled.
EndIf

While 1
;    Sleep(100) ; Wait or manually close the application via the traymenu icon.
WEnd

Ich bin raus.
 
@BFF
Knapp vorbei iat auch daneben. Es geht um Batch, und nichts als Batch. Oder aber um untaugliche BAT2EXEs. Die Aufgabenplanung wäre eine externe unabhängige Instanz wie es diese BAT2EXE sein müsste.

Hm, danke, aber so würde ja wieder "Müll" überbleiben
Eben das versuchte ich ja oben zu sagen: Es muss Müll übrig bleiben da sich Batches nicht selbst löschen (lassen) können außer sie verwenden andere Instanzen - Aufgabenplanung z.B.

CN8
 
Wieso können sich *.bat Dateien nicht selber löschen?
Bei mir gehts. Test.bat erstellt........ und weg.
Oder denke ich was falsches?


@Echo off
echo Hallo mein Name ist Test.bat
echo Wenn du eine Taste drueckst loesche ich mich selber.
pause
del test.bat
 
Es geht ja eigentlich um den Ordner. Aber hast recht - so logisch hatte ich auch noch nicht gedacht, daß man die Batch-Datei schon löschen kann, während sie noch ausgeführt wird. So sollte auch der Ordner gelöscht werden können, indem sich die Batch befand danach. Probiere ich später noch aus. Danke erstmal dafür.
 
JAA ich habs endlich. So einfach kann es sein, wenn man mit alles mögliche rumexperimentiert. (Bin nunmal ein Anfänger):

set a=%~dp0
echo timeout /t 2 >>Z:\DATEN\temp.bat
echo rd /s /q %a% >>Z:\DATEN\temp.bat
echo del Z:\DATEN\temp.bat >>Z:\DATEN\temp.bat
call Z:\DATEN\temp.bat
exit

So ist dann die Hauptbatch,der Ordner und die zweite Batch dann weg. Danke euch Jungs :)
 
TIMEOUT ist kein DOS-Batch mehr…

Ach ja… Diese [Batch-]Datei die die TEMP.BAT erzeugt… Die ist noch da. Es kann sich nach wie vor keine Batch selbst vernichten. (Zumindest habe ich noch nicht getestet was was passiert wenn sie FORMAT C: enthält.)

CN8
 
Zurück
Oben