Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit
GELÖST

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

Frage Microsoft

Mitglied: kuhnikuehnast

kuhnikuehnast (Level 1) - Jetzt verbinden

06.12.2009 um 00:24 Uhr, 13260 Aufrufe, 10 Kommentare

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
Mitglied: Biber
06.12.2009 um 01:37 Uhr
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
Bitte warten ..
Mitglied: kuhnikuehnast
06.12.2009 um 10:47 Uhr
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...

lg Kuhni (ps: realisiert wird das ganze für einen Server, der nicht immer laufen muss! )
Bitte warten ..
Mitglied: Biber
06.12.2009 um 18:23 Uhr
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...
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
Bitte warten ..
Mitglied: kuhnikuehnast
07.12.2009 um 01:29 Uhr
Jetzt bin ich etwas überfordert! 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...

lg Kuhni
Bitte warten ..
Mitglied: Biber
07.12.2009 um 13:25 Uhr
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
Bitte warten ..
Mitglied: 60730
07.12.2009 um 13:36 Uhr
Servus,

ich würde das anders machen....

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

01.
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...

01.
:check 
02.
tasklist /v |findstr /v "SYSTEM" |findstr /i /v "Dienst" && echo anscheinend läuft hier nix mehr - "Server kann abgeschaltet werden" && goto check2 
03.
goto check 
04.
:check2 
05.
ping - n 30 localhost >nul 
06.
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ß
Bitte warten ..
Mitglied: kuhnikuehnast
13.01.2010 um 00:15 Uhr
@ 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... 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
Bitte warten ..
Mitglied: 60730
13.01.2010 um 11:28 Uhr
Servus,

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

01.
set counter=0 
02.
for /d %%a in (explorer.exe,Outlook.exe) do Tasklist |find /i "%%a" && set /a counter=%counter%+1 
03.
if not %counter%==0 echo da läuft noch was. 
04.
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ß
Bitte warten ..
Mitglied: kuhnikuehnast
13.01.2010 um 14:26 Uhr
Tadaaa:

01.
@echo off 
02.
 
03.
FOR /f %%f IN (test.txt) DO ( 
04.
set counter=0 
05.
 
06.
	for /d %%a in (%f) DO ( 
07.
	Tasklist |find /i "%%a"   
08.
	set /a counter=%counter%+1 
09.
10.
 
11.
12.
 
13.
if not %counter%==0 echo da läuft noch was. 
14.
 
15.
if %counter%==0 echo Pc kann heruntergefahren werden. 
16.
pause
So müsste es doch funktionieren, oder? Hat mich ganz schön Arbeit gekostet das alles rauszufinden...

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

01.
rem @echo off bitte nur dann, wenn man sich sicher ist, das es läuft 
02.
 
03.
FOR /f %%f IN (test.txt) DO ( 
04.
set counter=0 
05.
rem wenn es so gehen würde -dann würde für jeden Eintrag in Test.txt  der zähler auf null gesetzt werden 
06.
rem also witzlos 
07.
	for /d %%a in (%f) DO ( 
08.
	Tasklist |find /i "%%a"   
09.
	set /a counter=%counter%+1 
10.
11.
 
12.
13.
 
14.
if not %counter%==0 echo da läuft noch was. 
15.
 
16.
if %counter%==0 echo Pc kann heruntergefahren werden. 
17.
pause
Das kann nicht laufen und die doppelte Schleife ist flüssiger als flüssig - überflüssig

01.
:@echo off  
02.
set counter=0 
03.
for /f %%a in (test.txt) do Tasklist |find /i "%%a" && set /a counter+=1 
04.
echo %counter% 
05.
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ß
Bitte warten ..
Neuester Wissensbeitrag
Windows 10

Powershell 5 BSOD

(3)

Tipp von agowa338 zum Thema Windows 10 ...

Ähnliche Inhalte
Batch & Shell
Batch-Variable nach Stichworten aus TXT Datei durchsuchen (3)

Frage von Markus5579 zum Thema Batch & Shell ...

Batch & Shell
gelöst Batch Abfrage Vergleiche mit Variable goto (4)

Frage von Zunaras zum Thema Batch & Shell ...

Batch & Shell
gelöst Batch Variable setzten mit Leerzeichen (3)

Frage von Marlon1 zum Thema Batch & Shell ...

Heiß diskutierte Inhalte
LAN, WAN, Wireless
gelöst Server erkennt Client nicht wenn er ausserhalb des DHCP Pools liegt (28)

Frage von Mar-west zum Thema LAN, WAN, Wireless ...

Windows Server
Server 2008R2 startet nicht mehr (Bad Patch 0xa) (18)

Frage von Haures zum Thema Windows Server ...

Outlook & Mail
Outlook 2010 findet ost datei nicht (18)

Frage von Floh21 zum Thema Outlook & Mail ...