Wie Fenster wieder öffnen?
Ich will ein Cmd fenster öffnen, welches sich nicht schließen lässt (d. h. es geht wieder auf) und das via eine cmd datei. Kann mir jdm. helfen?
2 Antworten
![](https://images.gutefrage.net/media/user/Erzesel/1497339133085_nmmslarge__0_524_1080_1080_4b38ff31970de3b94deb6a27ca8a8f01.jpg?v=1497339133000)
In Consolenanwendungen ist dies nicht ohne weiteres möglich, da diese "normalerweise" keinen Einfluss auf das FensterManagement haben. (in systemnahen Sprachen könnte man theoretisch einen Hook erstellen welcher in die "Mechanik" des Fensters eingreift)
Das ist mit Cmd/Batch nicht möglich. Ergo brauchen wir eine Instanz, welche auf unser Hauptfenster "aufpasst". Die einzige Möglichkeit ein Cmd-Fenster in Batch zu identifizieren ist dessen Titel als müssen wir unseren Fenstern Namen geben.
Die folgende Batch ist 2 Batchprogramme in einer Datei.
Beim normalen Start (per Mouseclick) wird kein Parameter übergeben. Die Batch startet sich selbst (:firstrun) minimiert mit dem Parameter watcher. damit weiß diese Instanz, das nur der Code von :watcher bis zum nächsten exit/b ausgeführt wird. (der macht nichts anderes als nachschauen ob das Hauptfenster geöffnet ist und ein paar sekunden zu warten) wird die Task mit dem Namen des Hauptfennsters nicht gefunden, wird die Batch erneut gestartet und dieser instanz per Parameter terminated mitgeteilt, dass der Watcher (Aufpasser) noch arbeitet und nicht erneut gestartet werden muss. Diese Instanz des Hauptfensters führt lediglich den Code nach :main aus.
das Hauptfenster fragt nach getaner Arbeit ob es regulär beendet werden soll. bei "J " bendet es den "Aufpasser" und zeigt zum Abschied noch eine Meldung...
Demo.cmd
@echo off
chcp 65001 >nul
rem diese beiden Settings sind nötig um die beiden Batchprozesse zu identifizieren (Du kannst auch Namen Deiner Wahl vergeben !!!keine Sonderzeichen!!!)
set "WatcherWindowName=Watcher" &rem Name des Wächterfensters
set "MainWindowName=Runner" &rem Name des sichtbaren Hauptfensters
set "detectionTime=1" &rem Zeit in Sekunden nach der das Ireguläre schließen des Fensters erkannt werden soll
rem teste wie die Batch gestartet wurde ohne Parameter=Normal, parameter=teminated unormal beendet ...
if "%~1"=="" goto :firstrun
if "%~1"=="terminated" (
echo Das Hauptfenster wurde nicht durch regulär durch sich selbst beendet!
goto :main
)
:watcher
rem ...ansonsten bleibt nur watcher= starte Wächter...
rem Code für den Watcher
rem setze den Fenstertitel für den Wächter
title %WatcherWindowName%
setlocal EnableDelayedExpansion
rem Endlosschleife! Kein Problem da der Watchprozess später "gewaltsam" gekillt wird.
for /l %%a in (0) do (
tasklist /nh /fi "Windowtitle eq %MainWindowName%"|find "cmd.exe" >nul||(
echo !date! !time! Das Fenster mit dem Namen "%MainWindowName%" wurde irregulär beendet ^^! &rem einfach die Schließzeiten ins WatcherFenster loggen...
start "" cmd /c "%~f0" terminated &rem wenn das Hauptfenster nicht existiert, starte es neu und und signalisiere den unnormalen restart
)
timeout %detectionTime% >nul
)
exit /b
:firstrun
rem starte Überwachungsthread mit dem Fenstertitel Watcher minimiert (könnte man auch total unsichtbar machen, wäre für einen Anfänger jedoch zu komplex)
rem wenn das Watcherfenster offen bleiben soll, entferne den Parrameter /min aus der nächsten Zeile
start "" /min "%~f0" watcher
:main
rem setze den Fenstertitel für das Hauptfenster
title %MainWindowName%
:mainLoop
rem hier alles was normal passeieren soll, solannge das Fenster nicht regulär per Abfrage beendet wird
echo Hallo Welt !
echo ich mache irgendwas!
echo:
echo:
rem bis hier
echo soll diese Batch normal beendet werden.
choice /m "entscheide Dich!"
if %errorlevel% equ 1 echo du hast mit Ja geantwortet! &goto :closeProgramm
if %errorlevel% equ 2 echo du hast mit Nein geantwortet!
goto :mainLoop
:closeProgramm
rem wenn wir bis hier gekommen sind wurde das Fenster nicht durch den Nutzer beendet...
rem nun beenden wir dem Überwachungsthread "gewaltsam"
taskkill /fi "Windowtitle eq %WatcherWindowName%" /f >nul
rem zeigen dem Nutzer noch ein paar Sekunden eine Meldung und schließen das Hauptfenste regulär.
echo Überwachungsthread beendet! Beende die Batch normal in:
timeout 5
exit /b
![](https://images.gutefrage.net/media/user/Nico8k/1618650987141_nmmslarge__0_0_3023_3024_b3ab443b0f60481e81ea92643ef07370.jpg?v=1618650987000)
Ich bin jetzt nicht am PC, aber ich hab den Code hier gefunden:
@echo off
:loop
start cmd /c ^"%~f0^"
goto loop
Kann auch eine Forkbomb sein, wie der Herr dort unten es so „nett“ erklärt hat. Wie gesagt, ich bin nicht am Pc.
![](https://images.gutefrage.net/media/user/Erzesel/1497339133085_nmmslarge__0_524_1080_1080_4b38ff31970de3b94deb6a27ca8a8f01.jpg?v=1497339133000)
😏na toll... Wenn Dir nichts besseres einfällt als eine ForkBomb....
!!! Nicht ausführen!!!...sonst bleibt nur noch der Resetknopf!
Der Fragestelle möchte ein Fenster, welches sich zumindest nach dem scließen wieder automatisch öffnet. (das Schließen lässt sich mit Batch nicht verhindern)
Du gibst stattdessen ein Fenster , welches wiederholt neue Fenster öffnet welche ihrerseits immer neue Fenster öffnen. da diese Batches in Endlosschleifen laufen, nutzt das cmd /c herzlich wenig, da die Batches ja nie eigene Endstadien erreichen, welche das Fenster schließen könnten.