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

Frage Microsoft

Mitglied: kuhnikuehnast

kuhnikuehnast (Level 1) - Jetzt verbinden

06.12.2009 um 00:24 Uhr, 13986 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
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
Batch-Variable rechnet immer weiter
Frage von ZwergkaninchenBatch & Shell4 Kommentare

Hallo, Leute! Ich wollte mir ein kleines Idle-Game in Batch schreiben, aber ich komm nicht weiter. Hier ist ein ...

Batch & Shell
Batch: Variable einen Wert zuweisen
gelöst Frage von sklaimBatch & Shell7 Kommentare

Hallo zusammen! Ich bin gerade am verzweifeln Ich habe in Batch 2 Variablen: Wenn ich mir von diesen den ...

Neue Wissensbeiträge
Batch & Shell

Open Object Rexx: Eine mittlerweile fast vergessene Skriptsprache aus dem Mainframebereich

Information von Penny.Cilin vor 1 TagBatch & Shell9 Kommentare

Ich kann mich noch sehr gut an diese Skriptsprache erinnern und nutze diese auch heute ab und an noch. ...

Humor (lol)

"gimme gimme gimme": Automatischer Test stolpert über Easter Egg im man-Tool

Information von Penny.Cilin vor 1 TagHumor (lol)6 Kommentare

Interessant, was man so alles als Easter Egg implementiert. Ist schon wieder Ostern? "gimme gimme gimme": Automatischer Test stolpert ...

MikroTik RouterOS

Mikrotik - Lets Encrypt Zertifikate mit MetaROUTER Instanz auf dem Router erzeugen

Anleitung von colinardo vor 1 TagMikroTik RouterOS8 Kommentare

Einleitung Folgende Anleitung ist aus der Lage heraus entstanden das ein Kunde auf seinem Mikrotik sein Hotspot Captive Portal ...

Sicherheit

Sicherheitslücke in HP-Druckern - Firmware-Updates stehen bereit

Information von BassFishFox vor 1 TagSicherheit1 Kommentar

Ein weiterer Grund, dass Drucker keinerlei Verbindung nach "auswaerts" haben sollen. Unter Verwendung spezieller Malware können Angreifer aus der ...

Heiß diskutierte Inhalte
Off Topic
Fachkräftemangel in Deutschland? - Talentschmiede schreibt alle 2 Tage die gleichen Stellen aus
Frage von Penny.CilinOff Topic12 Kommentare

Hallo, haben wir in Deutschland Fachkräftemangel? Die Talentschmiede schreibt gefühlt alle zwei Tage dieselben Stellen aus. Und das schon ...

Windows Server
Windows Store Apps
gelöst Frage von PeterleBWindows Server11 Kommentare

Gibt es einen Weg, auf Windows Server 2016 Windows Store Apps wie zum Beispiel die HP Smart App zu ...

Microsoft Office
Outlook Cache Mode Frage
Frage von GwaihirMicrosoft Office11 Kommentare

Hallo zusammen, bin gerade neu in der Firma und lerne hier einige neue Dinge kennen. Zum Beispiel, dass die ...

Microsoft
Erfahrungen mit Webcam over RDP gesucht
Frage von DerWoWussteMicrosoft10 Kommentare

Moin Kollegen. Bekanntlich kann man Webcams nur mit Drittanbietersoftware in RDP reinschleifen. Was nutzt Ihr dazu? Wie stabil funktioniert ...