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...
lg Kuhni
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...
lg Kuhni
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 131031
Url: https://administrator.de/contentid/131031
Ausgedruckt am: 27.11.2024 um 01:11 Uhr
10 Kommentare
Neuester Kommentar
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
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
Moin kuhnikuenast,
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
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...
Na ja - umständlich verglichen mit was?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...
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
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:
Lesen:
Hoch/Runterzählen & Schreiben
Grüße
Biber
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
Servus,
ich würde das anders machen....
Anstatt für jede Anwendung eine steuerbatch davorzustellen - die ein Flag (im Sinne einer gesetzten Variable) setzt...
Aber...:
auch so wäre mir das noch zu heiss...
lieber wenn so herum...
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ß
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ß
Servus,
zum abfackeln auf der DosBox: aus %% nur einen % machen - sonst so als Testballon
Und wie du anstatt den beiden harten .exe Einträgen eine Datei als Grundlage bekommst - ist dann deine Fleissaufgabe
Gruß
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
Gruß
Zitat von @kuhnikuehnast:
Tadaaa:
So müsste es doch funktionieren, oder? Hat mich ganz schön Arbeit gekostet das alles rauszufinden...
Weder noch...Tadaaa:
So müsste es doch funktionieren, oder? Hat mich ganz schön Arbeit gekostet das alles rauszufinden...
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
- 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ß