Edit: AspirinJunkie war schneller
(und ggf. besser)
Beiträge von Moombas
-
-
Ganz ehrlich: Wenn die Quelle schon so verhunzt ist, kannst du nur noch manuell jede einzelne Zeile durchgehen und korrigieren (nach export in CSV) und gleich nebenbei, nachdem die Korrekturen die erforderlichen Felder zu Tage gebracht haben, das wiederum in ein (selbst geschriebenes) Programm einarbeiten, mit dem die Mitarbeiter dann Arbeiten können.
Das Programm scheint nicht an die Bedürfnisse der Mitarbeiter angepasst zu sein, dann ist es kein Wunder, das diese sich ihre Wege suchen das so hin zu bekommen wie sie es brauchen (z.B. ganz simpel das Fehlen von EINEM (unbeschränktem) Kommentarfeld).
-
Nurmal eine Sache die ich auf die Schnelle gesehen habe die fehlt ist: Const
Und ich würde die Arrays dort aktuell noch vermissen, da diese ja durchaus essentiell sind.
-
Ich könnte mir vorstellen, das die Ausführung als "System" den Defender auf den Plan ruft. Hast du es mal mit einem Adminaccount versucht?
-
Hallo Moombas,
danke für die Hilfe. Allerdings läuft das skript "unbeaufsichtigt", d.h. Es soll solange "schleifen" bis wieder einer den Stecker steckt - und weiter gehts.
Danke!
Dann würde ich das dennoch trennen:
1. Prüfen ob eine Verbindung aufgebaut werden kann (Endlosschleife mit Ping), dennoch Empfehlung einen Shortcut zum Abbruch einbauen
2. Wenn erfolgreich: Code ausführen (der obige Code).
3. Prüfen ob die Verbindung (Endlosschleife mit Ping) wieder getrennt wurde und erst dann wieder bei "1." einsetzen um eine Mehrfachausführung zu vermeiden.
Q&D:
AutoIt
Alles anzeigenGlobal $bTerminate = False HotKeySet("{ESC}", "Terminate") Func WaitForDevice($S_IP, $s_port, $s_uID, $FC, $Start_regJanitza, $RegAnzahl) ; Auch hier müssen die POarameter rein, da du diese ja an die "finale Funktion" weiter geben musst. While 1 If $bTerminate then $bTerminate = False Exitloop Endif If Ping($S_IP, 1000) > 0 Then ;Warten bis das Gerät sich an der IP meldet, Timeout bitte ggf. anpassen If _example_nativ($S_IP, $s_port, $s_uID, $FC, $Start_regJanitza, $RegAnzahl) Then ;Code ausführen, falls erfolgreich warten bis die Verbindung getrennt wurde While Ping($S_IP, 1000) ;Warten bis das Gerät sich an der IP nicht mehr meldet, Timeout bitte ggf. anpassen sleep(100) If $bTerminate then $bTerminate = False Exitloop Endif WEnd EndIf EndIf WEnd EndFunc Func _example_nativ($S_IP, $s_port, $s_uID, $FC, $Start_regJanitza, $RegAnzahl) Local $iSock, $aJani, $iTry = 10 Local Const $_native_ModbusTCP_Debug_Send = 1 Local Const $_native_ModbusTCP_Debug_Recv = 1 ;MsgBox(0, "_example_native()", "Example modbusTCP only via Autoit") TCPStartup() For $Connect = 1 to $iTry $iSock = TCPConnect($S_IP, $s_port) sleep(1000) If $iSock = -1 Then ConsoleWrite("Fehler Verbindungsaufbau" & @LF) ConsoleWrite("Conn = IP: " & $S_IP &" Port: " & $s_port & " uId: " & $s_uID & " FC: " & $FC & " RegStart: " & $Start_regJanitza & " RegAnz: " & $RegAnzahl & @CRLF) If $Connect = $iTry Then Consolewrite('Fehler: Kein Verbindungsaufbau möglich.') Return False Else Consolewrite('Verbindungsaufbau (' & $Connect & ') fehlgeschlagen. Erneuter Versuch.' & @CRLF) EndIf Else ExitLoop EndIf Next $aJani = _native_ModbusTCP_ReadImputRegister($iSock, $Start_regJanitza, $RegAnzahl, "float") ;Functioncode 4, Register 1, Länge 4 Resiter lesen, als float zurückgeben ConsoleWrite("Conn = IP: " & $S_IP &" Port: " & $s_port & " uId: " & $s_uID & " FC: " & $FC & " RegStart: " & $Start_regJanitza & " RegAnz: " & $RegAnzahl & @CRLF) ConsoleWrite("$iSock = " & $iSock & @CRLF) ;ConsoleWrite("float = " & $aJani[0] & @CRLF) ;_ArrayDisplay($aJani) TCPShutdown() Return True EndFunc ;==>_example_nativ Func Terminate() $bTerminate = True EndFunc -
Naja, bei meinem Monitor von MSI (UWQHD) war ein entsprechendes Tool dabei und funktioniert ganz gut (MSI wird die Nutzung aber wohl auf ihre Monitore beschränken, habs jedoch noch nicht auf anderen probiert).
Das Einzige was ich dort vermisse, ist die Möglichkeit die von dir angesprochenen Teilbereiche zu definieren, wo du Fenster direkt "snappen" kannst, ohne ein anderes Programm aufzurufen mit dem du diesem den Teilbereich zuweist.
Und bei breiten Monitoren ist es auch im Privaten Bereich durchaus nützliches soetwas zu haben.
-
Ich rate davon ab, aus mehreren Gründen:
1. Schaffst du somit im worst case eine riesige Kaskade
2. Sobald der 2. bzw. Xte Aufruf der Funktion abgefrühstückt ist, springt er wieder an den Punkt wo sie aufgerufen wurde. Bedeutet, das alles was danach kommt Xmal ausgeführt wird.
Versuch den Verbindungsaufbau zu machen, pack das aber mit einem Timer sleep(X) (den hast du ja bereits) und in eine Schleife mit einem maximum von z.B. 10 Versuchen. Wenn die 10 Versuche fehlschlagen, Abbruch per z.B. Return 'keine Verbindung'.
Wenn die Verbindung erfolgreich ist mit ExitLoop raus aus der Funktion und dann kommt dein Code den du ausführen willst.
Edit: Hier mal, wie ich das quick & dirty Umsetzen würde in deinem Code. Ich habe dabei auch gleich die falschen/fehlenden Deklarationen korrigiert und erwarte (das würde ich wirklich empfehlen), das du die Werte, die in der () der Funktion stehen, der Funktion übergibst und nicht alle Global definierst. Letzteres wird dir sonst irgendwann auf die Füße fallen.
AutoIt
Alles anzeigenFunc _example_nativ($S_IP, $s_port, $s_uID, $FC, $Start_regJanitza, $RegAnzahl) Local $iSock, $iTry = 10 Local Const $_native_ModbusTCP_Debug_Send = 1 Local Const $_native_ModbusTCP_Debug_Recv = 1 ;MsgBox(0, "_example_native()", "Example modbusTCP only via Autoit") TCPStartup() For $Connect = 1 to $iTry $iSock = TCPConnect($S_IP, $s_port) sleep(1000) If $iSock = -1 Then ConsoleWrite("Fehler Verbindungsaufbau" & @LF) ConsoleWrite("Conn = IP: " & $S_IP &" Port: " & $s_port & " uId: " & $s_uID & " FC: " & $FC & " RegStart: " & $Start_regJanitza & " RegAnz: " & $RegAnzahl & @CRLF) If $Connect = $iTry Then Return 'Fehler: Kein Verbindungsaufbau möglich.' Else Consolewrite('Verbindungsaufbau (' & $Connect & ') fehlgeschlagen. Erneuter Versuch.' & @CRLF) EndIf Else ExitLoop EndIf Next $aJani = _native_ModbusTCP_ReadImputRegister($iSock, $Start_regJanitza, $RegAnzahl, "float") ;Functioncode 4, Register 1, Länge 4 Resiter lesen, als float zurückgeben ConsoleWrite("Conn = IP: " & $S_IP &" Port: " & $s_port & " uId: " & $s_uID & " FC: " & $FC & " RegStart: " & $Start_regJanitza & " RegAnz: " & $RegAnzahl & @CRLF) ConsoleWrite("$iSock = " & $iSock & @CRLF) ;ConsoleWrite("float = " & $aJani[0] & @CRLF) ;_ArrayDisplay($aJani) TCPShutdown() EndFunc ;==>_example_nativ -
Ja, hab ich gesehen.
Helfe auch gerne was die Strucktur angeht ( autoit_dau ), die finale Strucktur ist ja so oder so Benutzerspezifisch leicht variabel, sollte aber lesbar sein.
Ich denke einige Zeilenumbrüche kommen ggf. auch beim kopieren aus dem Editor hier auf die Webseite. Aber auch da sollte man vor dem Posten nochmal nachsteuern damit man damit was anfangen kann ohne den kompletten Code erstmal formatieren zu müssen wenn man helfen möchte.
-
Es ist ja nicht nur die Strucktur, sondern leider auch GLobale Variablen, die Lokal in einer funktion deklariert werden usw. (macht man nicht).
Wobei ich auch, sowohl weil ich von der ModBus-Ansteuerung zu wenig Kenntnis habe, als auch bei diesem Horror von Strucktur/Formatierung das Thema auch gleich mal verworfen habe.
-
Hi AspirinJunkie : Ich glaube ich war doch etwas ungenau. Ich wollte die '3' bei deiner Zeile 24 eben nicht, da ich diese "nicht weiß", sondern über die ID ermitteln und dann den zugehörigen tag .name ausgeben.
Ich habe/hatte die Hoffnung das es dafür etwas gibt, ohne das man eine Schleife durchlaufen muss und es relativ simpel abfragbar ist und ich es nur nicht weiß wie.
Habe es nun aber erst mal über eine Schleife gelöst.
-
Blöde (schnelle) Frage.
Weiß jemand ob ich auch direkt auf etwas zugreifen kann ohne das Array of Struct zu durchlaufen?
Evtl. ist etwas sample-Code besser um zu verstehen was ich meine:
AutoIt
Alles anzeigenOpt('MustDeclareVars', 1) #include <Array.au3> Global Const $tagVariables = 'struct;char id[36];char Name[999];endstruct' Global $Networks[1], $Count = 5 ReDim $Networks[$Count + 1] $Networks[0] = $Count For $i = 1 To $Networks[0] $Networks[$i] = DllStructCreate($tagVariables) Next For $Row = 1 to $Count $Networks[$Row].id = $Row $Networks[$Row].name = $Row & '_name' ConsoleWrite($Networks[$Row].id & ': ') ConsoleWrite($Networks[$Row].name & @CRLF) Next $Networks[0] = UBound($Networks) - 1 For $Row = 1 to $Networks[0] If $Networks[$Row].id = 3 then ConsoleWrite($Networks[$Row].name & @CRLF) ;funktioniert Next Global $A = DllStructGetData($Networks, '3', 'id') ;funktioniert nicht (Struct not a valid struct returned by DllStructCreate()) ConsoleWrite(@error & @CRLF) Consolewrite($A & @CRLF) -
casi4712 , das mit dem 0x2 habe ich in keinem meiner Codes verwendet, das kommt von BugFix und wenn du dir die Hilfe anschauen würdest, dann wüsstest du das dies $STDOUT_CHILD ist im opt_flag des run Befehls...
Die Powershellzeilen habe ich 1:1 von dir hier übernommen (Beitrag 13) und natürlich nicht geprüft, da ich zum einen nicht PS affin bin und zum anderen du dies schon vorher selber prüfen musst. Das Einzige, was ich geändert habe ist die Zeile bzgl. der ' und " in diesem Block (vergleich mal deinen Block aus #13 und meinen Block aus #16).
-
-
Ouch... dann schau bitte nochmal. (Siehe unten)
Hier mal eine Variante mit korrekten Einzügen und Lokal/Global deklarationen (deinen Fehler habe ich auch mal behoben).
Da ivch einiges abändern musste und das Einlesen des Zertifikats nich testen kann, bitte diesen Teil prüfen.
AutoIt
Alles anzeigenOpt('MustDeclareVars', 1) #AutoIt3Wrapper_Au3Check_Parameters=-q -d -w 1 -w 2 -w 3 -w 4 -w 5 -w 6 -w 7 #include <GuiConstants.au3> #include <FileConstants.au3> #include <ProcessConstants.au3> #include <WinAPIHObj.au3> #include <WinAPIProc.au3> #include <WinAPISys.au3> #include <WinAPIProc.au3> #include <WinAPISys.au3> #include <File.au3> Global Const $iWidth = 530, $iHeight = 120, $iBorder = 10 ;GUI Global $hMainGui = GUICreate('Zert Dropper', $iWidth, $iHeight, @DesktopWidth/2-$iWidth/2, @DesktopHeight/2-$iHeight/2, _ Default, BitOR($WS_EX_ACCEPTFILES,$WS_EX_TOPMOST)) Global $iInfoLabel = GUICtrlCreateLabel('Bitte ziehen Sie mit der Maus die erhaltene PFX-Datei in dieses Fenster ' & _ 'und lassen es hier fallen, danach geben Sie Ihr Passwort ein, welches ' & _ 'Sie per Mail erhalten haben, den Rest erledige ich für Sie.', _ $iBorder, $iBorder, $iWidth-2*$iBorder, $iHeight-2*$iBorder) GUICtrlSetFont($iInfoLabel, 16, 0, 'Arial') GUICtrlSetBkColor($iInfoLabel, $GUI_BKCOLOR_TRANSPARENT) GUICtrlSetState($iInfoLabel, $GUI_DROPACCEPTED) GUISetState(@SW_SHOW, $hMainGui) _mainLoop() Func _mainLoop() Local $iTry = 0 Local Const $iMaxTries = 3 While $iTry < $iMaxTries _GUILoop() $iTry += 1 If $iTry = $iMaxTries Then MsgBox(16, 'Fehler', 'Zu viele Versuche. Der Vorgang wird abgebrochen.', Default, $hMainGui) Exit Else MsgBox(16, 'Fehler', 'Leider hat das nicht geklappt. Der Vorgang wurde abgebrochen. Bitte ziehen Sie erneut die PFX Datei in das Fenster!', Default, $hMainGui) EndIf WEnd EndFunc Func _GUILoop() Local $sFile, $szDrive, $SzDir, $szFname, $szExt, $iMsg While Sleep(10) $iMsg = GUIGetMsg() Switch $iMsg case $GUI_EVENT_CLOSE GUIDelete($hMainGui) Exit case $GUI_EVENT_DROPPED If @GUI_DropId = $iInfoLabel Then $sFile = @GUI_DragFile _PathSplit($sFile, $szDrive, $szDir, $szFName, $szExt) ;~ Consolewrite($szExt & @CRLF) if Not _checkTyp($szExt) Then MsgBox(16, 'Fehler', 'Falscher Dateityp (' & $szExt & ').' & _ @CRLF & 'Fehler Info: ' & @extended, @extended, $hMainGui) Return ;~ Else ;~ MsgBox(1, 'Erfolg', 'Richtiger Dateityp.', @extended, $hMainGui) EndIf If Not _handleFile($sFile) Then Switch @error case 4 MsgBox(16, 'Fehler', 'Falsche Datei.' & _ @CRLF & 'Fehler Info: ' & @extended, @extended, $hMainGui) case 1 MsgBox(16, 'Fehler', 'Sie haben keine Datei gedropped, oder die Datei existiert nicht.' & _ @CRLF & 'Fehler Info: ' & @extended, Default, $hMainGui) case 2 MsgBox(16, 'Fehler', 'Das Passwort konnte nicht erfolgreich abgefragt werden.' & _ @CRLF & 'Fehler Info: ' & @extended, Default, $hMainGui) case 3 MsgBox(16, 'Fehler', 'Das Passwort war falsch, bitte noch mal versuchen ', Default, $hMainGui) EndSwitch Else GUIDelete() SplashTextOn('Herzlichen Glückwunsch', 'VPN Zertifikat wurde installiert, war doch einfach oder?', 300, 60, -1, -1, $DLG_NOTITLE) Sleep(7000) SplashOff() ExitLoop EndIf EndIf EndSwitch WEnd EndFunc Func _checkTyp($sPath) If $sPath = '.pfx' Then Return True Else Return False EndIf EndFunc Func _handleFile($sFile) Local Const $sPassword = _getPassword() If Not FileExists($sFile) Then return SetError(1, 0, False) ;keine Datei gedroppt If @error Then return SetError(2, @extended, False) _makeCert($sFile, $sPassword) If @error Then return SetError(3, @error, False) return True EndFunc Func _getPassword() ;$inp = InputBox('Bitte geben Sie Ihr Passwort ein:', '', '', '*') Local $sPassword = InputBox('Sicherheit', 'Geben Sie das Passwort für das Zertifikat ein.', '', ' M20', Default, Default, Default, Default, Default, $hMainGui) If @error Then return SetError(1, @error, '') return $sPassword EndFunc Func _makeCert($sFile, $sPassword) Local $hProcess, $iError Local Const $sCmd = 'certutil -f -p ' & $sPassword & ' -user -importpfx "' & $sFile & '"' Local Const $iPID = Run(@ComSpec & ' /c ' & $sCmd, '', @SW_HIDE) ; use /k instead of /c to see commandline result If @error Then SetError(1, @error, False) $hProcess = _WinAPI_OpenProcess($PROCESS_QUERY_LIMITED_INFORMATION, 0, $iPID) If @error Then SetError(2, @error, False) While ProcessExists($iPID) Sleep(10) WEnd $iError = _WinAPI_GetExitCodeProcess($hProcess) _WinAPI_CloseHandle($hProcess) If $iError <> 0 Then SetError(3, $iError, False) return True EndFunc -
Meine Tipps werden wohl ignoriert... Zeile 34, Zeile 45,... weiter habe ich dann nicht mehr geschaut.
Diese Stellen müssten auf Grund von Zeile 2 eigentlich auch schon Fehler auswerfen...
Und casi4712 generell wird hier niemand als zu blöd abgestempelt aber ich frage mich nur manchmal ob jemand "beratungsresistent" ist.
-
Weil für alle Beteiligten, oftmals die verschachtelten Anführungszeichen in AutoIt ein Problem sind. Das sieht man hier im Forum an verschiedensten Beiträgen. Fehler immer an den Anführungszeichen. CMD Befehl in die Batch kopieren, und mal sehen ob er da läuft? Dauert ein paar Sekunden, und die Überraschung ist oftmals groß.
Also empfiehlst du lieber den (aus meiner Sicht) unsinnigen Weg jemanden bei zu bringen, wie man das auslagert und wieder einließt anstatt ihm zu zeigen/beizubringen wie man es sicher richtig macht?
Das man einen Befehl, einen Aufruf etc. immer erst mal (wenn möglich) außerhalb vom skript verifiziert (aller spätestens bei der Fehlersuche), setze ich voraus.
Wichtiger ist denke ich, das man lernt, wie man solche Sachen sich "mal eben" in der Console oder einer msgbox/arraydisplay anzeigen kann, damit man die verwendeten Daten prüfen kann.
-
Wieso ist bei Euch nichts, was dich reizen würde und bezahlbar ist? Die Natur ist doch überall und spazieren gehen soll ja auch schon Sport sein.
Weil mich das nicht reizen würde.
Gleiches gilt für Radfahren (wenn es nur ums (stumpfe "im Kreis") Fahren geht; anders ist es für Erledigungen etc. von A nach B zu fahren)
Baseball wäre was, passt aber leider von den Zeiten kaum, da ich nur jedes 2. Wochenende teilnehmen könnte.
Bowling oder Kart z.B. (ob man das nun als Sport ansehen will überlasse ich jedem selber) ist auf dauer zu teuer. Mal nen Abend ja, aber nicht um das sinnvoll regelmäßig zu machen (mind. 1mal die Woche).
Nur mal 2 Beispiele.
-
Warum sollte man das machen?
Das Einzige was aus meiner Sicht Sinniger wäre, wäre ein Runwait anstatt des Run.
Das Runwait liefert den Exitcode des Aufrufs zurück und sollte damit verarbeitbar sein.
-
Football + Arbeitsschutz = Bubble Football

Withigerweise gibt es nur Bubble Rugby aber kein Bubble American Football

-
Sport schauen: Nein Danke. Einzige Ausnahme: Wenn es der eigene Nachwuchs ist.
Dann lieber selber Sport treiben. Und bevoir jemand fragt: Nein dazu bin ich zu faul
bzw. hier ist nichts was mich persönlich reizen würde oder bezahlbar wäre
.