Batch Datei nicht vom User schließbar?

Windoofs10  19.12.2024, 12:34

Kannst du uns den Inhalt der Batch-Dateien in die Fragebeschreibung machen oder Bilder davon?

Paule328 
Beitragsersteller
 19.12.2024, 13:07

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.

Woher ich das weiß:eigene Erfahrung – Ich mach das seit 30 Jahren