kuhnikuehnast
Goto Top

Batch- Globale Variable (gesetzt mit setx) in einer Batch mehrmals abrufen

An Batch mittels setx übergebene Variable auslesen.

Hi!
Ich habe ein Problem: Ich bin gerade dabei eine Batch zu schreibe. Ziel ist es, dass die Batch den Pc herunterfährt, wenn kein Programm mehr aktiv ist. Das soll sie über die Abfrage einer globalen Variablen erfahren (wenn 0 dann runterfahren). Programme werden über eine zweite Batch gestartet, die den Wert der globalen Variablen um 1 erhöhen. Werden die Programme geschlossen, so wird die Variable um 1 erniedrigt. Jetzt das Problem:

Wenn ich mir den Wert der Variablen hole, so wird er nicht jedes Mal neu global abgefragt, sondern bleibt irgendwie in der Routine drin... Beispiel:

@echo off

setx var 5 -m
@echo %var%

set i=%var%
set /a i=%i% - 1
@echo %i%

setx var %i% -m
@echo %var%

@echo.

pause


Liefert mir:

5
4
5

Das dürfte doch aber eigentlich nicht sein, oder?
Lokal zählt er runter, aber wenn er wieder var ausgeben soll nimmt er den alten wert, obwohl, eigentlich 544 ausgegeben werden müsste... Habt ihr eine Idee, wie ich das lösen kann? Irgendwie komm ich da gerade nicht weiter... face-sad

lg Kuhni

Content-ID: 131031

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

Ausgedruckt am: 27.11.2024 um 01:11 Uhr

Biber
Biber 06.12.2009 um 01:37:16 Uhr
Goto Top
Moin kuhnikuenasi,

willkommen in Forum.
Setx setzt "globale" Variablen in dem Sinne, dass diese ab sofort für jede neu gestartete Instanz der CMD.exe gelten.
Aber nicht für die gerade aktive - die bekommt gar nix davon mit.

Beispiel: Wenn du mit SETX eine Variable "dieHabIchNochNiedefiniert" mit dem Wert 43 setzt und dann ein neues CMD-Fenster öffnest, dann kannst du in diesem Variable und Wert sehen.

In dem Fenster, ein dem du das SETX abgefeuert hast allerdings nicht.
In dem Beispiel oben müsstest du jede Wertänderung, die du mit SETX für die nächste Instanz bewirken willst zusätzlich mit einem normalen SET in der aktiven Instanz nochmal durchführen.

Grüße
Biber
kuhnikuehnast
kuhnikuehnast 06.12.2009 um 10:47:11 Uhr
Goto Top
Hmm... Ok, das stimmt!
Aber wie kann ich das dann lösen? Ich möchte halt wie schon erwähnt folgendes:

- Im Autostart: Batch Ausschalten--> Alle 10min wird kontrolliert ob die Variable off=0 ist. Ist dies der Fall, wird der Pc ausgeschaltet.

- Wird ein Programm gestartet (über ne Batch, z.B. Programm)--> off=%off%+1. Dadurch soll die Ausschalten Batch dann wissen, dass jetzt ein Programm läuft, sie also nochmal 10min warten soll.

Habt ihr da eine Lösung für? Ich habe schon mit dem gedanken gespielt, eine Textdatei anzulegen, die dann ausgelesen wird, aber das ist doch eig. sehr sehr umständlich... face-sad

lg Kuhni (ps: realisiert wird das ganze für einen Server, der nicht immer laufen muss! face-smile)
Biber
Biber 06.12.2009 um 18:23:48 Uhr
Goto Top
Moin kuhnikuenast,

Zitat von @kuhnikuehnast:
Habt ihr da eine Lösung für? Ich habe schon mit dem gedanken gespielt, eine Textdatei anzulegen, die dann ausgelesen
wird, aber das ist doch eig. sehr sehr umständlich... face-sad
Na ja - umständlich verglichen mit was?
Okay, in diesen Zeiten, in denen eine Steuererklärung auf einen Bierdeckel passt und Bahnfahrkartenautomaten sozusagen PISA-proofed sind, da magst du etwas verwöhnt sein.

Ich würde den Weg über eine Flag-Datei wählen, also keine Textdatei, die ausgelesen wird, sondern eine Datei, die entweder da oder nicht da ist.
Beim (Durch-)Starten des Servers kannst du jeden dieser beiden Zustände sicherstellen.

Grüße
Biber
kuhnikuehnast
kuhnikuehnast 07.12.2009 um 01:29:09 Uhr
Goto Top
Jetzt bin ich etwas überfordert! face-smile Was meinst Du mit flag- Datei? Kannst Du da evtl. ein Beispiel posten? Habe mal ein wenig gegoogelt aber leider nix brauchbares finden können... Wichtig ist ja folgendes: (am Beispielszenario):
- Programm A startet --> "variable" in datei von 0 auf 1
- Programm B startet--> "variable" in datei von 1 auf 2
- Programm B wird geschlossen--> "variable" in datei von 2 auf 1--> Server weiß, dass immer noch ein Programm aktiv ist
- Programm A wird geschlossen--> 1wird zu 0--> Server schaltet sich aus... face-smile

lg Kuhni
Biber
Biber 07.12.2009 um 13:25:51 Uhr
Goto Top
Moin kuhnikuenast,

eine Flagdatei (zumindest so, wie ich diesen Begriff verwende) ist eine "Signal"-Datei, die genau zwei mögliche Zustände annehmen/signalisieren kann.
Ist da oder ist nicht da.
Also im Beispiel - wenn AppzA gestartet wird, dann wird eine Datei angelegt, die da heisst "%temp%\AppzAalive.xyz".
Wenn AppzA zu einem ordnungsgemäßen Ende kommr, löscht AppzA (oder eine Batch, die AppzA startet) diese Datei wieder.

Wenn es bei dir irgendeinen (informationshaltigen) Unterschied macht, ob AppzA einmal oder dreimal gestartet wurde, dann ist natürlich deine Variante mit Zähler hoch/runtersetzen sinnvoller.

Dazu kannst du dann eine Datei verwenden, die nur eine Zahl enhält unddie von einer Batch gelesen/neu geschrieben wird.

Bei Start:
>%temp%\counter.xyz echo 0

Lesen:
Set /p counter=<%temp%\counter.xyz

Hoch/Runterzählen & Schreiben
Set /p counter=<%temp%\counter.xyz
Set /a counter+=1
>%temp%\counter.xyz echo %counter%

Grüße
Biber
60730
60730 07.12.2009 um 13:36:43 Uhr
Goto Top
Servus,

ich würde das anders machen....

Anstatt für jede Anwendung eine steuerbatch davorzustellen - die ein Flag (im Sinne einer gesetzten Variable) setzt...

tasklist /v |findstr /v "SYSTEM" |findstr /i /v "Dienst" && echo anscheinend läuft hier nix mehr - "Server kann abgeschaltet werden"  

Aber...:
auch so wäre mir das noch zu heiss...

lieber wenn so herum...

:check
tasklist /v |findstr /v "SYSTEM" |findstr /i /v "Dienst" && echo anscheinend läuft hier nix mehr - "Server kann abgeschaltet werden" && goto check2  
goto check
:check2
ping - n 30 localhost >nul
tasklist /v |findstr /v "SYSTEM" |findstr /i /v "Dienst" && echo anscheinend läuft hier immer noch nix - Server kann abgeschaltet werden && shutdown parameter1 parameter2 usw.  

Versuche das lieber so mit doppeltem Boden - macht mehr Sinn - und Versuche meint auch - das ist aus dem Bauch Status ungetestet....

und die Edit sagt - diese Batch müsste dann aber auch ausgefiltert werden, denn "die" läuft ja während des laufs....
(und schon wirds noch komplizierter)....

Gruß
kuhnikuehnast
kuhnikuehnast 13.01.2010 um 00:15:21 Uhr
Goto Top
@ TimoBeil:
Das Problem is ja aber, dass man mit Deinem System alles überprüft... Sprich: Auch die Anwendung xy die im Tray bei jedem Start gestartet wird (z.B. Virenscanner) wird als laufender Dienst erkannt und deswegen der Server nicht heruntergefahren...

Es ginge ja theoretisch nur darum, dass bestimmte Dienste abzufragen sind, die vorher definiert werden müssten. Also, dass gezielt geschaut wird, ob ein Programm aus der Liste (beigefügte Textdatei oder so) online ist.

Hui, jetzt hab ich gerade beim schreiben dieses Textes einen neuen Lösungsansatz entwickelt... face-smile cool!

Also folgende Aufgabenstellung:

Ich möchte wissen, ob ein Prozess noch läuft. Die Prozesse werden vorher in einer Textdatei definiert. (z.B. ein kompletter Virenscan oder die Defragmentierung, oder das Backup,...)
Wie kann ich also definieren, das eine Textdatei, in der die Prozesse benannt sind mit den laufenden Prozessen abgeglichen wird?

lg Kuhni
60730
60730 13.01.2010 um 11:28:18 Uhr
Goto Top
Servus,

zum abfackeln auf der DosBox: aus %% nur einen % machen - sonst so als Testballon

set counter=0
for /d %%a in (explorer.exe,Outlook.exe) do Tasklist |find /i "%%a" && set /a counter=%counter%+1  
if not %counter%==0 echo da läuft noch was.
if %counter%==0 echo da läuft keiner der beiden Tasks

Und wie du anstatt den beiden harten .exe Einträgen eine Datei als Grundlage bekommst - ist dann deine Fleissaufgabe face-wink

Gruß
kuhnikuehnast
kuhnikuehnast 13.01.2010 um 14:26:53 Uhr
Goto Top
Tadaaa:

@echo off

FOR /f %%f IN (test.txt) DO (
set counter=0

	for /d %%a in (%f) DO (
	Tasklist |find /i "%%a"    
	set /a counter=%counter%+1
	)

)

if not %counter%==0 echo da läuft noch was.

if %counter%==0 echo Pc kann heruntergefahren werden.
pause

So müsste es doch funktionieren, oder? Hat mich ganz schön Arbeit gekostet das alles rauszufinden... face-smile

lg Kuhni
60730
60730 13.01.2010 um 15:12:51 Uhr
Goto Top
Zitat von @kuhnikuehnast:
Tadaaa:
So müsste es doch funktionieren, oder? Hat mich ganz schön Arbeit gekostet das alles rauszufinden... face-smile
Weder noch...
Aber ich will mal nicht so sein...
nach der Vorlage wäre es wirklich ein leichtes gewesen - ohne harte Arbeit

rem @echo off bitte nur dann, wenn man sich sicher ist, das es läuft

FOR /f %%f IN (test.txt) DO (
set counter=0
rem wenn es so gehen würde -dann würde für jeden Eintrag in Test.txt  der zähler auf null gesetzt werden
rem also witzlos
	for /d %%a in (%f) DO (
	Tasklist |find /i "%%a"    
	set /a counter=%counter%+1
	)

)

if not %counter%==0 echo da läuft noch was.

if %counter%==0 echo Pc kann heruntergefahren werden.
pause

Das kann nicht laufen und die doppelte Schleife ist flüssiger als flüssig - überflüssig

:@echo off 
set counter=0
for /f %%a in (test.txt) do Tasklist |find /i "%%a" && set /a counter+=1  
echo %counter%
Pause

Wenn schon so herum - dann so face-wink
- wobei wir mittlerweile der Lösung sowas von nah sein sollten - wie der Thread / Lösung nichts mehr mit der ursprünglichen Überschrift gemeinsam hat.

Gruß