ceerotolerance
Goto Top

Alle anderen Fenster mit dem selben Titel schliessen

ich wollte immer nur eine Instanz meines Batch Skripts zulassen...

Hallo zusammen

ich habe wieder bisschen gebätscht.
Wie der Titel schon suggeriert, wollte ich, dass sich alle offenen Batch-Skripte mit dem selben Titel automatisch schliessen, wenn ich ein neues aufmache. Diese Aufgabe konnte ich einigermassen bewältigen. Nur leider hat es noch einige unschönheiten drin, welche vielleicht jemand mit mir ausmerzen kann.

Das Skript sieht bisher so aus:
@echo off & setlocal
title=test.bat

REM zweimal suchen, damit an erster Stelle durchnummeriert wird
tasklist /FI "WINDOWTITLE EQ test.bat" | findstr "cmd.exe" | findstr /n /c:"cmd.exe" >echo.txt  
for /f "delims=:" %%i in ('findstr /n $ "echo.txt"') do set /a linecount=%%i   
REM echo linecount = %linecount%
REM letzte Zeile beinhaltet die neuste PID die erhalten bleiben muss
for /F "tokens=1-3* delims=: " %%i in (echo.txt) do set /a count=%%i & set /a pid=%%k & call :Proc  

:Proc
	echo Instanz %count% hat PID: %PID%
	REM Letzte Instanz am Leben lassen
	if "%count%" == "%linecount%" goto :End  
		echo kill it
		taskkill /FI "PID EQ %PID%" >nul  
		goto :EOF
		
:End
	echo Ich darf leben...
	pause
	del echo.txt

Am schlimmsten ist es, dass :Proc noch ein zweites Mal aufgerufen wird, nachdem alle alten Fenster geschlossen wurden. Das schadet der Funktionalität zwar nicht, jedoch möchte ich gerne verstehen wieso das gemacht wird und wie ich es besser machen könnte. Ausserdem bin ich offen für Anregungen wie der Code sonst noch kürzer oder sonst irgendwie besser geschrieben werden könnte.

Bin offen für alle Inputs. Danke und Gruss

cee

Content-ID: 121787

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

Ausgedruckt am: 25.11.2024 um 03:11 Uhr

Pjordorf
Pjordorf 31.07.2009 um 17:38:55 Uhr
Goto Top
Hallo,

füge ein bei Zeile 15 und Zeile 30.


> @echo off & setlocal
> title=test.bat
> 
> REM zweimal suchen, damit an erster Stelle durchnummeriert wird
> tasklist /FI "WINDOWTITLE EQ test.bat" | findstr  
> "cmd.exe" | findstr /n /c:"cmd.exe" >echo.txt  
> for /f "delims=:" %%i in ('findstr /n $  
> "echo.txt"') do set /a linecount=%%i   
> REM echo linecount = %linecount%
> REM letzte Zeile beinhaltet die neuste PID die erhalten bleiben muss
> for /F "tokens=1-3* delims=: " %%i in (echo.txt) do set /a  
> count=%%i & set /a pid=%%k & call :Proc

rem verhindern das Proc nochmals durchlaufen wenn es nichts mehr gibt
goto EOF

> :Proc
> 	echo Instanz %count% hat PID: %PID%
> 	REM Letzte Instanz am Leben lassen
> 	if "%count%" == "%linecount%" goto :End  
> 		echo kill it
> 		taskkill /FI "PID EQ %PID%" >nul  
> 		goto :EOF
> 		
> :End
> 	echo Ich darf leben...
> 	pause
> 	del echo.txt
>
>:EOF
>
> 


Peter
ceerotolerance
ceerotolerance 02.08.2009 um 09:18:49 Uhr
Goto Top
Ja das war's. Auf Zeile 30 ist das Label gar nicht nötig, da das Ende der Datei sowieso mit :EOF bezeichnet wird.

Kann mir jemand noch sagen, wie ich es machen könnte, ohne dass ich eine temporäre Datei benötige?

Das wär super. Danke und Gruss
cee