Top-Themen

Aktuelle Themen (A bis Z)

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

Mitglied: kuhnikuehnast

kuhnikuehnast (Level 1) - Jetzt verbinden

06.12.2009 um 00:24 Uhr, 14294 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 ..
Ähnliche Inhalte
Batch & Shell
Batch - Variablen
gelöst Frage von Marlon1Batch & Shell2 Kommentare

Hallo, Ich habe eine Frage zu Variablen. Und zwar ob es irgendwie geht das Batch mit ein IF Befehl ...

Batch & Shell

Batch mehrmals durchlaufen, immer mit anderem Variableninhalt

gelöst Frage von Winfried-HHBatch & Shell2 Kommentare

Hallo in die Runde! Wie kann ich eine Batch mehrfach durchlaufen, und zwar mit einer Parameterliste. Soll heißen: Parameterliste: ...

Batch & Shell

Verwendung einer gesetzten Variable noch in derselben Eingabezeile

gelöst Frage von EvaEdenBatch & Shell9 Kommentare

Liebe Gemeinde, ich habe ein simples Problem: Ich muss ein paar Befehle in einer Zeile abschicken. Kein Problem, da ...

Batch & Shell

Variable aus VBS in Batch einlesen

gelöst Frage von racer1601Batch & Shell4 Kommentare

Hallo ich habe das Problem das ich die Variable "Ordner" aus einem VBS Script nicht in meine Batch bekomme. ...

Neue Wissensbeiträge
Windows 10

USB Maus und Tastatur versagen Dienst unter Windows 10

Erfahrungsbericht von hardykopff vor 1 TagWindows 105 Kommentare

Da steht man ziemlich dumm da, wenn der PC sich wegen fehlender USB Tastatur und Maus nicht bedienen lässt. ...

Administrator.de Feedback
Update der Seite: Alles zentriert
Information von Frank vor 1 TagAdministrator.de Feedback18 Kommentare

Hallo User, die größte Änderung von Release 5.8 ist das Zentrieren der Webseite (auf großen Bildschirmen) und ein "Welcome"-Teaser ...

Humor (lol)

WhatsApp-Nachrichten endlich auch per Bluetooth versendbar

Information von BassFishFox vor 2 TagenHumor (lol)4 Kommentare

Genau darauf habe ich gewartet! ;-) Der beliebte Messaging-Dienst WhatsApp erhält eine praktische neue Funktion: Ab dem nächsten Update ...

Google Android

Googles "Android Enterprise Recommended" für Unternehmen

Information von kgborn vor 3 TagenGoogle Android3 Kommentare

Hier eine Information, die für Administratoren und Verantwortliche in Unternehmen, die für die Beschaffung und das Rollout von Android-Geräten ...

Heiß diskutierte Inhalte
Windows Server
Standortvernetzung zu einem Strato VServer (Windows)
Frage von matzefratze81Windows Server10 Kommentare

Moin, ich komme aus einem Enterprise-Umfeld und habe den Fehler gemacht, dass ich mich auf ein kleines Unternehmen eingelassen ...

Grafikkarten & Monitore
4k EIZO Monitor, Fernseher und Splitter
Frage von LerxxeyGrafikkarten & Monitore9 Kommentare

Hallo Zusammen, vielleicht könnt ihr mir bei einem Problem helfen wo ich einfach nicht mehr weiterkomme Und zwar haben ...

Microsoft Office
Freitagsfrage? Excel und CSV - Import statt öffnen
gelöst Frage von KraemerMicrosoft Office7 Kommentare

Moin zusammen, entweder fallen mir heute nicht die richtigen Wörter für Google ein, oder es geht schlicht nicht. Gibt ...

Entwicklung
Batch - Überprüfung
gelöst Frage von apex.predator24Entwicklung6 Kommentare

Hallo Zusammen Gibt es eine Möglichkeit, einen Prozess im TaskManager über eine Batch-Datei zu überprüfen ob dieser läuft oder ...