(Powershell) Endlosschleife, Logikproblem

JägerMeister05

Lt. Junior Grade
Dabei seit
Sep. 2005
Beiträge
281
Hallo,

ich möchte mir mit Powershell ein Hilfstool mit GUI scripten, das Temperaturwerte von meinem Raid-Controller ausliest. Das funktioniert soweit bereits alles einwandfrei. Die Hauptfunktion habe ich jedoch während des Programmierens auf einen Button gelegt, so dass ich direkt überprüfen kann ob es auch so funktioniert wie ich mir das vorstelle.
Jetzt möchte ich aber, das der Teil des Skriptes, der die Temperaturen ausliest und in die GUI überträgt, zum Beispiel alle 5 Minuten automatisch erneut ausgeführt wird, solange das Programm läuft. Wie mache ich das am besten ?
Mir fällt keine Bedingung für eine Schleife ein, mit der ich eine solche Wiederholung erreiche. Ausserdem soll die Schleife ja auch nicht die ganze Zeit ausgeführt werden, sondern eben erst nach einer bestimmten Zeitspanne, da ja ansonsten die CPU-Last hochgeht.

Das Problem ist, rein logisch dürfte überhaupt keine Schleife für mein Problem die Lösung sein. Denn sobald ich eine Bedingung nehme, die nicht zutrifft, springt er ja aus der Schleife raus und geht nicht mehr automatisch rein. Wenn ich aber eine nehme, die zutrifft, und sie aber Endlos ist, habe ich ja das Problem mit der CPU-Last, bzw. der Anzahl an Schleifendurchgängen. Also da hänge ich im Moment :D

Habe schon viel gegoogled, aber irgendwie finde ich nicht den richtigen Ansatz oder ich stehe einfach total aufm Schlauch oO. Wäre dankbar wenn mir hier vielleicht einer auf die Sprünge helfen könnte. THX (btw bin Powershell-Anfänger :D )


MfG JägerMeister
 

KeepXtreme

Lt. Commander
Dabei seit
Sep. 2008
Beiträge
1.346
klassische Endlosschleife mit true als Bedingung und einem pausieren nach jedem durchlauf reicht nicht?
 

evilbaschdi

Lt. Commander
Dabei seit
Aug. 2011
Beiträge
1.935
mit was hast du die gui gebastelt? würde sowas eigentlich immer über nen aufgabenplaner job oder bei größeren sachen über nen windows dienst lösen. weiß nicht, in wiefern das bei deiner lösung ne möglichkeit darstellt.
 

JägerMeister05

Lt. Junior Grade
Ersteller dieses Themas
Dabei seit
Sep. 2005
Beiträge
281
@KeepXtreme und Harzerkas: das mit dem sleep hatte ich mir auch schon überlegt, aber ich habe das nicht so richtig hinbekommen. Ich werde es nochmal versuchen, aber meine Frage ist, wird dann überhaupt jemals der Code ausgeführt, der nach der Schleife kommt ?

@evilbaschdi: Mit Powershell kann man auf die .Net Bibliotheken zugreifen und kann somit auch ganz einfach eine GUI basteln:

Code:
$Erg=[reflection.assembly]::LoadWithPartialName("System.Windows.Forms")


$form = New-Object "System.Windows.Forms.Form" #Erstellung der GUI
$form.TopMost = $false
$form.Text = "TempTool"
$form.AutoSize = $true
$form.Height = 340

$button = New-Object "System.Windows.Forms.Button"
$button.Top = 20
$button.Width = 150
$button.Text = "Temperaturwerte erfassen"
Es gibt auch einen GUI-Designer, mit dem man dann einfach seine GUI zusammenklickt und am Ende dann automatisch Powershell-Code dafür erzeugt wird: http://www.sapien.com/blog/topics/software-news/primalforms-software-news/



//edit: Also ich habe es nochmal mit dem cmdlet Start-Sleep versucht, aber ich bekomme es nicht hin:

Code:
$endlos = 1

do
{
Code...

Start-Sleep -s 10

echo $valhddTemp
}
while ($endlos = 1)
Das funktioniert nicht. Am ende lasse ich mir nochmal die Tempwerte alle in der Konsole ausgeben, aber das macht er nicht, er kommt nie ans Ende. Warum?

//edit2: Also ich habe die Vermutung das es etwas mit der GUI zu tun hat, da in allen Beispielen die ich google es genau so funktioniert wie ich es gepostet hab. Ob man nun oben einfach while($true) macht oder sonstwas ist ja egal. Vielleicht brauch ich für eine richtige GUI doch eine andere Entwicklungsumgebung, da ich auch später erreichen möchte, das das Script im Systray läuft und praktisch als Monitoringtool dient. Leider kann ich keine Programmiersprache und tue mir schon mit dem scripten recht schwer und muss fast alles googlen.



//edit3: Ich habe es gelöst, und zwar so:


Code:
$timer = New-Object "System.Windows.Forms.Timer"
$timer.Interval = 5000
$timer.Start()

$timer.Add_Tick(
{

Aufruf
})
Alles was in dem Tick-Event steht wird alle 5 Sekunden erneut aufgerufen. Umliegender Programmcode wird weder angehalten noch sonst beeinflusst.
 
Zuletzt bearbeitet:
Top