Buttons klickbar machen
-
casi4712 -
21. Januar 2022 um 12:27 -
Erledigt
-
-
Error:Variable used without beeing declared
Poste bitte Dein ganzes Script!
Mit diesen Ausschnitten kann man nicht helfen.
-
Die Fehlermeldung besagt du hast dein Variable benutzt ohne sie als Local bzw. Global zu definieren also:
Und den Beweis sehe ich hier:
AutoItFunc _SQL() $SeviceName = "SQL Server (AUGIAS)" ;name of the service to test RunWait(@ComSpec & " /c net start > c:\temp\services.txt", "", @SW_HIDE);send a list of the services that are running to a file $FileText = FileRead("c:\temp\services.txt", FileGetSize("c:\temp\services.txt"));read that file If StringInStr($FileText, $SeviceName) Then;check for the service name $st = "RUNNING" Else $st = "OFF" EndIf EndFunc ;==>_test
$st wird nicht definiert und du übergibst den Wert auch nicht wieder!
Das gleiche betrifft ggf. auch $ServiceName und $FileText. Richtig wäre nun so:
Code
Alles anzeigenFunc _SQL() Local $st ;fehlt! und ich würde es hier direkt als = False setzen! Local $FileText ;fehlt! Local Const $SeviceName = "SQL Server (AUGIAS)" ;name of the service to test ; Local Const fehlte RunWait(@ComSpec & " /c net start > c:\temp\services.txt", "", @SW_HIDE);send a list of the services that are running to a file ;hier würde eine Prüfung Sinn machen $FileText = FileRead("c:\temp\services.txt", FileGetSize("c:\temp\services.txt"));read that file If StringInStr($FileText, $SeviceName) Then;check for the service name $st = "RUNNING" ;ich würde True wählen Else $st = "OFF" ; ich würde False wählen EndIf Return $st EndFunc ;==>_test
Und der Aufruf wäre dann Sinnvoll so (wenn man True und False verwendet): if _SQL() then
Das sind alles Sachen die der Gründlichkeit zu Grunde liegen und hier bereits angesprochen wurden.
-
Hallo casi4712 (Chris),
ich darf mich Oscar anschließen und darauf hinweisen das dein ganzes Skript benötigt wird, um zügig zu helfen bzw. ggf. auch andere Fehler gleich mit aufzudecken.
Auch wenn du schreibst das du Foren durchsuchst (u.a. dieses hier) um nicht gleich fragen zu müssen und dir viel Mühe insgesamt machst, ist es wünschenswert wenn du mehr auf die Vorschläge der Helfenden hier eingehst.Zwei Beispiele:
1. Dein Syntaxfehler bzw. das Nachfragen danach (Post #19) bei Velted siehst du wenn du die beiden Versionen vergleichst (bestenfalls über ein "Diff") wie bspw.:
Oder du versuchst mehr auf die Consolenausgabe/den Output zu achten, dort wirst du auch darauf hingewiesen 🧐 .2. Bzgl. deines aktuellen Fehlers
ZitatError:Variable used without beeing declared
Ohne das gesamte Skript, kann man dazu nicht viel sagen. Es ist also notwendig das du das Skript postest und bestenfalls den Output (Consolenausgabe), denn dort wird ebenfalls per Zeilennummer darauf hingewiesen, um welche Variable es sich handelt.
Es liegt nahe, genau wie Moombas beschreibt, dass falls du den Code nicht diesbzgl. verändert hast, du auf den Variablenscope achten musst (siehe post #12, da dort folgendes hinzu kam und dort auch die fehlenden Scopes von mir definiert wurden):
Dies bekommst du ebenfalls im Output gesagt - welche Stelle es betrifft.
Fazit:
Es soll dich nicht abschrecken weiter Fragen zu stellen, doch beschäftige dich bitte zunächst mit den Hilfestellungen die dir sowieso gegeben sind und wenn du dann nicht weiter kommst, poste die vollständigen Informationen, Danke.
Viele GrüßeSven
-
Und eine Bitte:
Wenn du Code postest, aktiviere in der Syntaxeinstellung "AutoIt". Die Autoerkennung funktioniert nicht und mit Syntaxhighlighting fallen Fehler viel schneller ins Auge.
-
Also erst einmal recht herzlichen Dank für die vielen Tips. Ich ziehe mir auch super gerne alle möglichen Schuhe an, aber ich versuche hier nun auch wirklich jeden Tip in die Tat um zu setzen. Das Script habe ich in meinem Anfangspostig bereits gepostet. Aber ich findes es schon angsteinflößend, dass man zig Zeilen Code benötigt um einen Dienststatus abzufragen und in eine Variable zu stecken, ich fand am Anfang ja PS schon kompliziert. Gibt es da wirklich keine kürzeren Ansätze?
@Mombas: Deinen Code werde ich gleich mal ausprobieren.
lieben Dank
Gruss
Chris
-
Also ich habs jetzt getestet; IST IMMER NOCH NICHT DECLARED. Ich habs jetzt mal auf das notwendigste heruntergekürzt, um die Übersichtlichkeit zu gewährleisten. Es gibt doch eine MöglichKeit via RUN und Hide einen Batchbefehl im Hintergrund laufen zu lassen, kann man von diesem keine Variable an Autoit übergeben?
AutoIt
Alles anzeigen; Script Start - Add your code below here ;another fast hack by UEZ 2011 #include-once #include <GDIPlus.au3> #include <WindowsConstants.au3> #include <GUIConstantsEx.au3> #include <StaticConstants.au3> #include <WindowsConstants.au3> #include <WinApi.au3> #include <String.au3> #include "GUIBkImage.au3" #include <GuiCtrlSetOnHover_UDF.au3> Global $RBOX_EVENT_CLOSE = 1 Global $ROUNDES = 20, $LastHwnd = 0 Global $GUIBKCOLOR = 0xEEC591 Global $ARRAY_COLOR_TOP_MIN[3] = [36 ,65 ,142] , $ARRAY_COLOR_TOP_MAX[3] = [11 ,42 ,122] Local $hGui = RBoxCreate("LAX -Version 4.0 Beta",840,600) Global $idButton_1 = GUICtrlCreateButton("Customize PC", 10, 55, 100, 20) GUICtrlSetTip( -1, "Standard Image an Benutzer anpassen") ;LABELS _SQL() GUICtrlCreateLabel("CUSTOMIZING" & _StringRepeat(" ", 185) & "Local DB-Server: " & $st, 10, 35, 980, 20) While True CheckX($hGui,$RBOX_EVENT_CLOSE,"GuiCtrlSetColor("&$RBOX_EVENT_CLOSE&",0xA3A3A3)","GuiCtrlSetColor("&$RBOX_EVENT_CLOSE&",0x555555)") $gMsg = GUIGetMsg() Switch $gMsg Case $GUI_EVENT_CLOSE, $RBOX_EVENT_CLOSE GUIDelete($hGUI) Exit Case $idButton_1 $iPID = Run("C:\Users\Administrator\Downloads\PC-Einrichtung\PCSETTING_listv2.cmd", "", 10) EndSwitch ;Checks _SQL() WEnd Func RBoxCreate($Title,$width, $height ,$left=-1 ,$top=-1 ,$show=1) Local $GUI = GUICreate($Title,$width,$height,$left,$top,$WS_POPUP) GUISetBkColor($GUIBKCOLOR,$GUI) $RBOX_EVENT_CLOSE = GUICtrlCreateLabel('X',$width-20,3,25,25) GUICtrlSetCursor($RBOX_EVENT_CLOSE,0) GUICtrlSetBkColor($RBOX_EVENT_CLOSE,-2) GUICtrlSetFont($RBOX_EVENT_CLOSE,15,800) GUICtrlSetColor($RBOX_EVENT_CLOSE,0x555555) $Title &= " " Local $hTitle = GUICtrlCreateLabel($Title,0,0,$width-20,26,$SS_CENTER,$GUI_WS_EX_PARENTDRAG) GUICtrlSetFont($hTitle,17,400,0,"Consolas") GUICtrlSetBkColor($hTitle,-2) Local $Graphic = GUICtrlCreateGraphic (0,0, $width, 25) GUICtrlSetState($Graphic,$Gui_DISABLE) If $show = 1 Then GUISetState(@SW_SHOW,$GUI) Return $GUI EndFunc Func CheckX($hGui, $CtrlID, $sCMD, $eCMD) Local $cGui = GUIGetCursorInfo($hGui) If Not IsArray($cGui) Then Return 0 if $LastHwnd <> $cGui[4] And $cGui[4] = $CtrlID Then Return Execute($sCMD) + Assign("LastHwnd",$cGui[4]) if $LastHwnd <> $cGui[4] Then Return Execute($eCMD) + Assign("LastHwnd",$cGui[4]) EndFunc Func _SQL() Local $st ;fehlt! und ich würde es hier direkt als = False setzen! Local $FileText ;fehlt! Local Const $SeviceName = "SQL Server (AUGIAS)" ;name of the service to test ; Local Const fehlte RunWait(@ComSpec & " /c net start > c:\temp\services.txt", "", @SW_HIDE);send a list of the services that are running to a file ;hier würde eine Prüfung Sinn machen $FileText = FileRead("c:\temp\services.txt", FileGetSize("c:\temp\services.txt"));read that file If StringInStr($FileText, $SeviceName) Then;check for the service name $st = "RUNNING" ;ich würde True wählen Else $st = "OFF" ; ich würde False wählen EndIf Return $st EndFunc ;==>_test
PS: Wo istz die Syntaxeinstellung im Forum zu finden?
lg
Chris
-
GUICtrlCreateLabel("CUSTOMIZING" & _StringRepeat(" ", 185) & "Local DB-Server: " & $st, 10, 35, 980, 20)
Die Variable $st taucht hier erstmalig auf. Sie wurde vorher nicht deklariert, kein Wert zugewiesen. Somit erscheint die Fehlermeldung.
Es gibt doch eine MöglichKeit via RUN und Hide einen Batchbefehl im Hintergrund laufen zu lassen, kann man von diesem keine Variable an Autoit übergeben?
Direkter Austausch ist nicht ohne Weiteres machbar. Aber warum überhaupt Batch? Erledige doch alles in AutoIt.
PS: Wo istz die Syntaxeinstellung im Forum zu finden?
</> klicken zum Code einfügen, auf den Text "Quellcode" klicken und im Menü auswählen.
-
Hi casi4712, hi BugFix,
Direkter Austausch ist nicht ohne Weiteres machbar. Aber warum überhaupt Batch? Erledige doch alles in AutoIt.
Genau das hatte ich dich bereits im post #10 gefragt Chris.
Desweiteren schreibst du:Aber ich findes es schon angsteinflößend, dass man zig Zeilen Code benötigt um einen Dienststatus abzufragen und in eine Variable zu stecken, ich fand am Anfang ja PS schon kompliziert. Gibt es da wirklich keine kürzeren Ansätze?
Die gibt es sehr wahrscheinlich, doch dazu solltest du dein Ziel erläutern.
Denn ansonsten sehe ich die Konversation hier als ping-pong in gefühlter Endlosschleife 🙁 .
Viele Grüße
Sven -
Das sollte ja auch langfristig das Ziel sein, das mit Batch embedded wäre ja auch nur ein Notnagel, aber irgendwie will er ja nicht die Variable deklarieren, ich ging wohl fäschlicherweise davon aus, dass diese in der Funktion deklariert wird. Wie muss es denn aussehen damit die Variable $st nun einen Wet annimmt. Wenn das schon so kompliziert ist einen DienstStuts anzuzeigen, wie kompliziert ist es erst einen Reg Wert entsprechend abzufragen. Das geht in Batch und PS definitif einfacher.
Das Ziel war doch ganz einfach, ich möchte in der GUI angezeigt bekommen, ob ein entsprechender Dienst läuft oder nicht, dachte das hätte ich erwähnt.
-
Ganz einfach, du benutzt die Variable $st auch außerhalb dieser Funktion.
Aber da ich nun sehe wo du sie einsetzt musst du Zeile 29 löschen und Zeile 31 ändern: GUICtrlCreateLabel("CUSTOMIZING" & _StringRepeat(" ", 185) & "Local DB-Server: " & _SQL(), 10, 35, 980, 20)
Weiterhin gewöhne dir Formatierungen und Einrückungen an.
Auch scheint einiges keinen Sinn zu ergeben. Deine CheckX Funktion z.B. da ist die Abfrage nach $cGui[4] keinen Sinn, da du den gleichen Befehl auch ohne diese Bedingung ausführst.Siehe neue Verschachtelung im Code unten.Mein FehlerAutoIt
Alles anzeigenOpt('MustDeclareVars', 1) #AutoIt3Wrapper_Au3Check_Parameters=-q -d -w 1 -w 2 -w 3 -w 4 -w 5 -w 6 -w 7 ; Script Start - Add your code below here ;another fast hack by UEZ 2011 #include-once #include <GDIPlus.au3> #include <WindowsConstants.au3> #include <GUIConstantsEx.au3> #include <StaticConstants.au3> #include <WindowsConstants.au3> #include <WinApi.au3> #include <String.au3> #include "GUIBkImage.au3" #include <GuiCtrlSetOnHover_UDF.au3> Global $gMsg, $iPID Global $RBOX_EVENT_CLOSE = 1 Global Const $ROUNDES = 20, $LastHwnd = 0 Global Const $GUIBKCOLOR = 0xEEC591 Global Const $ARRAY_COLOR_TOP_MIN[3] = [36 ,65 ,142] , $ARRAY_COLOR_TOP_MAX[3] = [11 ,42 ,122] Global Const $hGui = RBoxCreate("LAX -Version 4.0 Beta",840,600) Global Const $idButton_1 = GUICtrlCreateButton("Customize PC", 10, 55, 100, 20) GUICtrlSetTip( -1, "Standard Image an Benutzer anpassen") ;LABELS GUICtrlCreateLabel("CUSTOMIZING" & _StringRepeat(" ", 185) & "Local DB-Server: " & _SQL(), 10, 35, 980, 20) While True CheckX($hGui,$RBOX_EVENT_CLOSE,"GuiCtrlSetColor("&$RBOX_EVENT_CLOSE&",0xA3A3A3)","GuiCtrlSetColor("&$RBOX_EVENT_CLOSE&",0x555555)") $gMsg = GUIGetMsg() Switch $gMsg Case $GUI_EVENT_CLOSE, $RBOX_EVENT_CLOSE GUIDelete($hGUI) Exit Case $idButton_1 $iPID = Run("C:\Users\Administrator\Downloads\PC-Einrichtung\PCSETTING_listv2.cmd", "", 10) EndSwitch ;Checks _SQL() ;Sinn? WEnd Func RBoxCreate($Title,$width, $height ,$left=-1 ,$top=-1 ,$show=@SW_SHOW) Local $hTitle, $Graphic Local Const $GUI = GUICreate($Title, $width, $height, $left, $top, $WS_POPUP) GUISetBkColor($GUIBKCOLOR, $GUI) $RBOX_EVENT_CLOSE = GUICtrlCreateLabel('X', $width-20, 3, 25, 25) GUICtrlSetCursor ($RBOX_EVENT_CLOSE, 0) GUICtrlSetBkColor($RBOX_EVENT_CLOSE, -2) GUICtrlSetFont ($RBOX_EVENT_CLOSE, 15, 800) GUICtrlSetColor ($RBOX_EVENT_CLOSE, 0x555555) $Title &= " " $hTitle = GUICtrlCreateLabel($Title, 0, 0, $width-20, 26, $SS_CENTER, $GUI_WS_EX_PARENTDRAG) GUICtrlSetFont ($hTitle, 17, 400, 0, "Consolas") GUICtrlSetBkColor($hTitle, -2) $Graphic = GUICtrlCreateGraphic (0,0, $width, 25) GUICtrlSetState($Graphic, $Gui_DISABLE) GUISetState($show, $GUI) Return $GUI EndFunc Func CheckX($hGui, $CtrlID, $sCMD, $eCMD) ;hier würde ich verschachteln und du hast keinen "else" fall, also einen undefinierten Fall. Local Const $cGui = GUIGetCursorInfo($hGui) If IsArray($cGui) Then if $LastHwnd <> $cGui[4] Then if $cGui[4] = $CtrlID Then Return Execute($sCMD) + Assign("LastHwnd",$cGui[4]) Else Return Execute($eCMD) + Assign("LastHwnd",$cGui[4]) EndIf Else SetError(1) Return False EndIf Else SetError(0) Return False EndIf EndFunc Func _SQL() Local $st, $FileText Local Const $SeviceName = "SQL Server (AUGIAS)" ;name of the service to test RunWait(@ComSpec & " /c net start > c:\temp\services.txt", "", @SW_HIDE);send a list of the services that are running to a file if @error = 0 then $FileText = FileRead("c:\temp\services.txt", FileGetSize("c:\temp\services.txt"));read that file If StringInStr($FileText, $SeviceName) Then;check for the service name $st = "RUNNING" Else $st = "OFF" EndIf Return $st Else Return 'ERROR' Endif EndFunc ;==>_test
-
Das Ziel war doch ganz einfach, ich möchte in der GUI angezeigt bekommen, ob ein entsprechender Dienst läuft oder nicht, dachte das hätte ich erwähnt.
Hier mal eine UDF von mir, kannst du dazu nutzen (Sie ist noch unvollständig, aber GetInfo funzt):
Bsp.:
-
Ohne Bugfix's au3 schlecht machen zu wollen, nur eine Alternative:
Für Dienste nutze ich die Services.au3 (müsste von engine sein). Hat bei mir bisher bei allen Anfragen problemlos funktioniert.
-
PS: Wo ist die Syntaxeinstellung im Forum zu finden?
Wie BugFix bereits schrieb :
Wenn Du AutoIt-Scriptcode einfügen möchtest, verwende </> aus der blauen Liste im Header.
Dann erscheint :
Dort AutoIt wählen und [Speichern].
Du kannst das auch nachträglich noch umstellen.
(ich habe in Deinen Beitrag #27 die Syntaxhervorhebung mal von C zu AutoIt geändert)
-
@Mombas: Bingo, jetzt haut es hin, das mit den 3 unterschiedlichen Variablentyopen hier, hatte ich noch nicht ganz auf den Schirm, werd ich mich noch mal genauer mit befassen, auch die Formnatierungen gewöhn ich mir an. Recht herzlichen Dank noch mal an alle
lg
Chris
-
Eigentlich gibt es nur zwei Variablentypen: Local und Global und zusätzlich gibt es die Möglichkeit aus einer Variable, eine Konstante (Const) zu machen.
Btw.: Wegen deines Dienstes mit der services.au3, die ich oben gepostet habe, mache ich das vom Pinzip her so:
AutoIt
Alles anzeigenFunc Request_Service($Servicename) if _Service_Exists($Servicename)then Return Status(_Service_QueryStatus($Servicename)[1]) else Return 'Service does not exist' endif endfunc Func Status($Status) Switch $Status Case 1 $Status = 'SERVICE_STOPPED' Case 2 $Status = 'SERVICE_START_PENDING' Case 3 $Status = 'SERVICE_STOP_PENDING' Case 4 $Status = 'SERVICE_RUNNING' Case 5 $Status = 'SERVICE_CONTINUE_PENDING' Case 6 $Status = 'SERVICE_PAUSE_PENDING' Case 7 $Status = 'SERVICE_PAUSED' Case Else $Status = 'SERVICE_UNKNOWN_STATE' EndSwitch Return($Status) EndFunc
-
Und die Localen gelten nur innehalb einer FUnktion, denk ich mal. Das mit der UDF werde ich direkt mal ausprobieren, dann könnte man das Ding ja auch direkt für andere Services weiter verwenden, die Frage wäre nur wie das in meinem Fall, in meinem Label aufgerufen werden würde. Also nach meinem Dafürhalten müsste es so gehen:
AutoItGUICtrlCreateLabel("CUSTOMIZING" & _StringRepeat(" ", 185) & "Local SQL-Server: " & Request_Service(MSSQL), 10, 35, 980, 20)
Tut es aber nicht.
Eine andere Sache wäre noch die der Aktualisierung. In meinem alten räudigen Batch musste ich nur Return kloppen und, so fern sich ein Dienst aktualisiert hat, ist es aktualisiert worden. In AutoIt scheint es hierfür keine Lösung zu geben oder? Dass heisst GUI beenden und neu starten wäre angesagt?
lg und schöne Restwoche
Chris
-
Hi,
richtig "Locale" geht nur in einer Funktion, ansonsten sind sie trotz "Locale" Definition Global.
Zum Einen müsste dein MSSQL ein String sein, also mit Anführungsstrichen: "MSSQL".
Zum Anderen musst du sicherstellen, das der Dienst auch so heißt (kannst du in den Diensten (services.msc) nachschauen).
Zu deinem Return: Nein das kannst du auch über die normalen GUI abfragen realisieren (hab da eine Lösung im Kopf, damit aber noch nie selber gearbeitet).
Daher würde ich hierbei das Zepter gerne jemandem überlassen, der in AutoIt mehr mit GUI arbeitet als ich
-
In AutoIt scheint es hierfür keine Lösung zu geben oder? Dass heisst GUI beenden und neu starten wäre angesagt?
Dein Aufbau ist einfach nicht optimal.
1. GUI erstellen - Label ohne Inhalt
2. Funktion erstellen, die Werte (Dienst) abfragt und Ergebnis dem Label zuweist (GUICtrlSetData)
3. Funktion aufrufen bei Anzeige GUI
4. Entweder ein durch User ausgelöster erneuter Funktionsaufruf (Button) oder
5. Pollen der Funktion im Hintergrund (AdlibRegister) - auf vernünftiges Intervall achten
NB
Dauernd motzt du, warum das nicht so einfach ist, wie du willst und in Batch oder Sontwas ist das doch so einfach...!
Wenn du AutoIt nutzen möchtest (niemand zwingt dich dazu), dann musst du dich auch auf die Sprache einlassen und dir zuallererst ein Grundwissen aneignen. Das wird dir mit jeder Spache so gehen.
Da du anscheinend von Batch kommst, solltest du dich zuallererst mit dem Konzept von Funktionen vertraut machen und die in deinem Hinterkopf schwirrende "GoTo-Anweisung" dahin werfen, wo sie hingehört: auf den Scheiterhaufen der unglücklichen Programmierung.
-
Hi casi4712,
abgesehen davon, dass ich absolut hinter den Ausführungen und Empfehlungen von BugFix stehe, möchte ich dich nochmal bitten deinen aktuellen und vollständigen Code-Stand zu posten. Auch deine Abhängigkeiten, bspw. "Services.au3" oder "Service.au3", je nach dem was du nun verwendest.
Warum:
Damit wir besser helfen können. Ich möchte mir nicht immer erst deinen vermeintlichen Code-Stand zusammensuchen müssen 😉 . Respekt an Moombas an dieser Stelle, der dies offensichtlich tut 😁 .
Stelle bitte einfach alles bereit (die Abhängigkeiten einfach als Anhang) und dann bekommst du sicherlich noch mehr und zügige Hilfestellung. Danke.
Viele GrüßeSven
-