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-Key: 121787

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

Printed on: April 19, 2024 at 01:04 o'clock

Member: Pjordorf
Pjordorf Jul 31, 2009 at 15:38:55 (UTC)
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
Member: ceerotolerance
ceerotolerance Aug 02, 2009 at 07:18:49 (UTC)
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