Batch Datei nicht vom User schließbar?
Hallo, und zwar würde ich gerne wissen wollen ob es möglich ist eine [Name1].bat Datei zu erstellen, welche unsichtbar im Hintergrund läuft und dafür sorgt, dass eine andere [Name2].bat Datei offen läuft und ausschließlich durch den Befehl exit, von der Datei selber geschlossen werden kann. Andernfalls, falls der User versucht die [Name2].bat zu schließen, wird diese sofort neu geöffnet. Außerdem, sobald [Name2].bat durch exit geschlossen wird soll sich auch [Name1].bat schließen.
[Name2].bat enthält momentan die Befehle: title, color, echo, ping, set, if, exit
Kannst du uns den Inhalt der Batch-Dateien in die Fragebeschreibung machen oder Bilder davon?
Aussch die [Name2].bat hat bisher code, [Name1].bat ist momentan noch leer. [Name2].bat:
set, setzen von Zahlen, erhöhen/ verringern dieser Zahlen
Ping localhost -n [Zahl] >nul
1 Antwort
Immer diese "gehtnichtLeute" 😅
Batchdateien unter Windows sollten die Endung .cmd haben!Klar geht dergleichen, ist Bei ConsolenAnwendungen/-Scripten nur etwas umständlich.
Die Aufpasser-/Wächterbatch startet sich ertsmal per JScript selbst als unsichtbares Hintergrundfenster. Dessen Hauptcode prüft regelmäsig ob sichtbarer Hauptfenster (Runner.cmd) geöffnet , wenn nicht wird es gestartet.
Da "wscript" auf die frühen 2000er Jahre datiert, kann dieser nicht mit UTF8-Zeichen (Umlauten) umgehen. Das heist, der Name dieser Batch darf keine Unlaute/UTF8-Zeichen enthalten!watcher.cmd
@echo off
chcp 65001>nul
if "%~1"=="hidden" goto :hiddenTask
set self=%~f0
cd %~dp0
echo var shell = new ActiveXObject('shell.application'); shell.ShellExecute('%self:\=\\%', 'hidden', '', 'open', 0)>"%temp%\runHidden.js" &rem erzeuge Hilfsscript für unsichtbaren Hintergrundstart
wscript "%temp%\runHidden.js" &rem ausführen Hilfsscript startet diese batch im Hintergrund
exit /b
rem das folgende läuft unsichtbar im Hintergrund
:hiddenTask
set "RunnerBatch=runner.cmd" &rem Name der Batch für das Hauptfenster
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
title %WatcherWindowName%
for /l %%a in (0) do (
tasklist /nh /fi "Windowtitle eq %MainWindowName%"|find "cmd.exe" >nul||(
start "" cmd /c "%RunnerBatch%" terminated &rem wenn das Hauptfenster nicht existiert, starte es neu und und signalisiere den unnormalen restart
)
timeout %detectionTime% >nul
)
exit /b
Das sichtbare folgende Hauptfenster führt was immer Du wünscht aus und fragt ab ob es geschlossen werden soll. Bei Ja wird das unsichtbare Wächterfenster/-Script regulär beendet. (Unsichtbare Fenster kann man nur per Taskmanager bzw "taskkill" beenden!!!)
runner.cmd
@echo off
chcp 65001>nul
set "MainWindowName=Runner" &rem mus der geiche sein, wie im Wächert festgelegt
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
Das verwalten von zwei Batchscripten ist immer problematisch. deshalb kann auch beide zu einer Batchdatei vereinen:
all_In_One.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
if "%~1"=="hidden" goto :hiddenTask
set self=%~f0
cd %~dp0
echo var shell = new ActiveXObject('shell.application'); shell.ShellExecute('%self:\=\\%', 'hidden', '', 'open', 0)>"%temp%\runHidden.js" &rem erzeuge Hilfsscript für unsichtbaren Hintergrundstart
wscript "%temp%\runHidden.js" &rem ausführen Hilfsscript startet diese batch im Hintergrund
exit /b
: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
Unter neuerern Windows11-Installationen kann der alte Scriptinghost (wscript) bereits deaktiviert sein.
Für diesen fall ersetze die Zeilen:
set self=%~f0
cd %~dp0
echo var shell = new ActiveXObject('shell.application'); shell.ShellExecute('%self:\=\\%', 'hidden', '', 'open', 0)>"%temp%\runHidden.js"
wscript "%temp%\runHidden.js"
durch:
powershell "start -wi h cmd '/c \"\"%~f0\"\" hidden'"
lezteres verwende ich lediglich nicht Standardmäßig, da Powershell langsamer startet als der alte Scriptinghost.