Öhm ja und wozu wurden Funktionen erfunden? Wo ist das Problem dir eine Funktion zu schreiben die ein "sicheres" stringbetween durchführt. Du brauchst dein Errorhandling nur einmalig in dieser Funktion, unabhängig davon wieviele Strings du damit nun zerlegst. Als Rückgabewert gibts du dann einen String aus und brauchst dir im eigentliche Code keine Gedanken mehr machen wegen fehlerhaften Array Zugriffen.
Beiträge von misterspeed
-
-
Passt vielleicht nich ganz dazu zum Thema aber weiß jemand vielleicht wie ich das so einstell dass die IP sich entweder nicht mehr ändert,
Lies die Anleitung deines Routers und richte den DHCP Server des Routers so ein, dass er anhand der MAC Adresse der jeweiligen Netwerkkarte immer die gleiche IP vergibt. (Stichwort: "static DHCP")
Alternativ konfiguriere die IP am jeweiligen Gerät statisch. Da du aber davon sprachst, dass der Laptop teilweise in fremden WLANS aktiv ist, also vermutlich nicht immer bei dir zuhause steht könnte eine statische IP Konfiguration am Gerät problematisch sein, da jedes Netzwerk andere IP settings haben kann. Die beste Lösung ist also der weg über deinen Router und statischer DHCP IP Vergabe. -
Du scheinst nicht wirklich gelesen zu haben was ich dir zum Thema Verbindungsverwaltung im Server geschrieben habe.
Dein Server macht folgendes:
1. Neue Verbindung akzeptieren und den Verbindungssocket in der Variable $connection speichern.
Problem:
Du prüfst nichtmal ob sich überhaupt ein Client verbunden hat und versuchst munter "test" an einen vielleicht garnicht existenten Socket zu schicken. Schau dir bitte die Hilfe zu TCPAccept an, dort findest du z.B. die Info, dass die Funktion -1 zurückgibt wenn sich niemand verbunden hat (Fehlerfall), davon ab findest du dort auch ein passendes Code Beispiel.2. Nach deinem evtl. erfolglosen Versuch etwas an "Niemanden" zu schicken machst du genau das was ich dir in meinem ersten Posting schon geschrieben habe.
Problem:
Du überschreibst im zweiten Durchlauf der Schleife die Variable $connection das Senden klappt also im Höchstfall genau einmal, nämlich immer dann wenn dein Client sich gerade eben erst mit dem Server verbunden hat. Nach dem jeweils nächsten Schleifendurchlauf kennt dein Server den Client nicht mehr, da du den Socket überschreibst.Dein Client zeigt unter Umständen auch nicht zwingend beim ersten Mal den Text "test" an, da das tcprecv evtl. ausgeführt wird bevor dein Server die Nachricht gesendet hat. Deswegen kann die msgbox natürlich auch mal leer sein. Ich würde zum testen im übrigen entweder mit consolewrite() arbeiten oder eine kleine GUI verwenden in der du die empfangenen oder gesendeten Texte anzeigst. Eine msgbox ist blockierend, das bedeutet solange die msgbox angezeigt wird arbeitet das betreffende Script nicht weiter.
-
TCPAccept() hat in einem Client nichts verloren. Diese Funktion wird nur im Server benötigt um neue eingehende Verbindungen von beliebigen Clients via TCPConnect() zu akzeptieren. Auch im Server solltest du darauf achten, dass du dir niemals eine TCPAccept() "socket" Variable mit einem schon verbundenen Client überschreibst, ansonsten kannst du nur noch mit dem neuverbundenen Client, aber nicht mehr mit dem alten Client kommunizieren. Wenn du also nur eine gleichzeitige Verbindung im Server zulassen willst darfst du TCPAccept() nach einer erfolgreichen Verbindung erst dann wieder aufrufen wenn die alte sauber beendet wurde. Alternativ kann und sollte man den oder die Verbindungssockets besser in einem Array speichern. So stellst du sicher, dass du jederzeit alle verbundenen Clients ansprechen kannst und die Verbindungen auch serverseitig beenden kannst.
Soviel mal zu den Grundlagen wie man neue Verbindungen im Serverscript verarbeitet.
Der Client muss kaum etwas tun. Er muss lediglich mit TCPconnect() eine Verbindung herstellen. Je nachdem wie du die Kommunikation zwischen Client und Server gestalten willst sendet nun der client mit TCPSend() seine Wünsche an den Server oder der Client wartet erstmal in einer Schleife mit TCPRecv() bis ihm der Server hallo sagt und ihm Instruktionen gibt. Die Verbindung zwischen beiden Scripten bleibt beliebig lange bestehen und es können beliebig oft von beiden Seiten aus Daten mit TCPSend() gesendet und mit TCPRecv() empfangen werden. Das einzige was du dafür brauchst ist im Client der socket den dir TCPconnect() zurückgibt und im Server der Socket den dir TCPAccept() zurückgibt.
Dein Problem wird vermutlich zum einen wie oben angesprochen damit zusammenhängen, dass dein Server schon beim zweiten Schleifendurchlauf den Socket des Clients nicht mehr kennt und zum anderen natürlich dass dein Client am falschen Socket auf Nachrichten wartet. Dein Client ist in der jetzigen Form Server und Client gleichzeitig, wobei er als Client nur einmalig etwas sendet und keine Antwort vom Server abwartet. In der Endlosschleife wartet dein Client dann nur noch auf eingehende Verbindungen, sprich er ist nun ein Server.
Ich hoffe du konntest mir folgen und hast verstanden was du falsch machst.
-
Ich persönlich programmiere bevorzugt in einer virtuellen Maschine. Dort kann ich dann auch bedenkenlos den Virenscanner deaktivieren (oder erst garkeinen installieren). Eine virtuelle Umgebung hat auch Vorteile wenn man Scripte schreibt die etwas tiefer ins System eingreifen, da man hier gefahrlos testen und ggf. auch wieder auf einen alten Zustand der VM zurückgehen kann. Eine Zeit lang hatte avira bei mir ebenfalls Probleme beim Kompilieren gemacht. Das Problem trat nur bei 64bit Programmen auf. Ich würde jedenfalls davon abraten den Windows Temp Ordner generell von der Virenprüfung auszuschließen, da gerade in den Tempordnern oftmals Viren landen können.
-
Wenn das ganze von 2005 ist dürfte das ziemlich simpel aufgebaut sein, sprich sehr wahrscheinlich keine Flash basierte Webseite. Schau einfach den Quellcode der Webseite an und finde das Element des Buttons der da gedrückt werden muss. Ob du die ESC Taste danach wirklich brauchst oder ob ein einfaches Navigate zur Ursprunsseite auch reicht kann ich dir nicht sagen. Evtl. befindet sich auf der Bestätigungsseite auch ein weiterer Button den du automatisiert betätigen kannst. Auch hier hilft ein Blick in den Webseitenquellcode. Wenn du den Weg per winhttp gehen willst schau dir das Firefox Plugin "Live HTTP Headers" an. Damit kannst du mitschneiden was genau dein Browser an den Webserver sendet. (vermutlich ein einfaches GET mit einem bestimmten Parameter an eine PHP Datei.)
-
Deine Lösung ist die denkbarst schlechteste und unzuverlässigste. Prüfe lieber folgende Alternativen:
1. Frag den Hersteller bzw. schau dir die Dokumentation der Software genauer an. Ich würde mal vermuten, dass es auch mit den bereitgestellten Mitteln möglich sein sollte gewisse Dinge zu protokollieren. Evtl. stellt der Anbieter auch eine API bereit um die Werte ohne Browserautomatisierung direkt auszulesen oder es gibt weitere Dienste die dir erlauben direkter auf evtl. vorhandene Logdateien oder Hilftools des Gerätes zuzugreifen (z.B. per Telnet / SSH / FTP)
2. Sofern Variante 1 keine Lösung ist solltest du dich tiefer mit der Automatisierung von Webbrowsern beschäftigen. Funktionen für den Internetexplorer ("ie.au3") sind bereits im Autoit Paket enthalten, Funktionen für Firefox findest du hier im Forum ("ff.au3" bzw. "ffex.au3")
3. Performanter ist es allerdings auf einen richtigen Browser zu verzichten und stattdessen direkt mit dem Webserver zu kommunizieren. Dafür gibt es z.B. die "winhttp.au3"
Alle drei Varianten sollten wesentlich zuverlässiger und schneller sein als deine derzeitige Lösung.
-
Würde das mit einem 2D-Array und timerinit / timerdiff lösen.
Das Array wäre so aufgebaut:
Initial vergibst du für noch nie gedrückte Tasten einen Timestamp von "" oder -1 und prüfst das später auch. Diesen Defaultwert verwendest du auch nach einer ausgeführten Aktion um die Aktion nicht mehrmals auszuführen (also ein Reset).In deiner Hauptschleife prüfst du für alle relevanten Tasten ob sie gedrückt wurden. Falls ja aktualisierst du den zugehörigen Timestamp in deinem Array mit timerinit.
Nach der Aktualisierung der Timestamps prüfst du ob Aktionen notwendig sind indem du dein Array durchgehst.Für die Bedingung "Wenn weder Taste A, noch Taste B, noch Taste C in den letzen 2 Sekunden gedrückt wurde, dann drücke Taste D" brauchst du nun nur mit timerdiff alle drei Timestamps (A,B,C) mit den 2 Sekunden abgleichen. Bleiben alle drei Einträge bei über 2 Sekunden bzw. haben die Einträge noch den Defaultwert, dann führst du die Aktion aus (Taste D). Wenn du nicht willst dass die Aktion danach permanent ohne pausen ausgeführt wird solltest du die Timestamps der drei Tasten setzen, dadurch dauert es dann mindestens 2 Sekunden bis die Taste D Aktion erneut ausgeführt werden kann. Achtung den Timestamp von Taste A solltest du nicht setzen, da du später noch prüfst ob die Taste manuell gedrückt wurde. Eventuell wäre es auch besser eine extra Timer Variable zu verwenden um diese Aktion nur in bestimmten intervallen auszuführen und die Timestamps der einzelnen Tasten nicht zu verändern, dadurch verhinderst du Komplikationen mit deinen anderen Bedingungen.
Für die beiden anderen Aktionen prüfst du lediglich ob der zugehörige Array Eintrag den Defaultwert oder einen Timestamp hat und führst dementsprechend die Aktion aus. Hierbei nicht vergessen den Timestamp auf den Defaultwert zu setzen, damit die Aktion erst wieder ausgeführt wird wenn die Taste erneut gedrückt wurde.
-
Nochmal... hast du dir die beiden Funktionen _filelisttoarray() und _arraysearch() überhaupt in der Hilfe angesehen? Wie bereits erwähnt kannst du damit den gesuchten Ordnerpfad problemlos ermitteln. Ansonsten schließe ich mich Andy einfach mal an. Du scheinst weder gewillt zu sein hier Klartext zu reden um was es überhaupt geht (vermutlich mal wieder ein Verstoss gegen die Forenregeln), noch scheinst du gewillt zu sein dein Problem selbst zu lösen in dem du die hier genannten Lösungsansätze prüfst.
Was deine Virenphobie anbelangt... Bugfix wollte dir denke ich sagen, dass es völlig normal und unerheblich ist wenn 3 unbekannte und kaum verbreitete Virenengines von über 50 deine Datei als Virus erkennen. Solange die "big player" wie Kaspersky, Avast, AVG, McAffee, Trendmicro, Avira und Bitdefender nichts finden würde ich mir kaum sorgen machen, dass ein normaler Anwender jemals eine Warnmeldung erhält.
-
Warum sollte deine GUI auch von selbst verschwinden wenn du nichts machst ausser die Warteschleife zu verlassen. Um eine GUI unsichtbar zu machen benötigst du guisetstate() und um eine GUI dauerhaft zu löschen guidelete(). Bei beiden Funktionen ist es sinnvoll das Handle zur GUI mit anzugeben, da ansonsten immer nur die zuletzt erstellte GUI gelöscht bzw. unsichtbar gemacht werden kann. Deine Funktion welche die GUI erstellt sollte also das Handle der GUI mit return zurückgeben, ansonsten hast du später im Scriptverlauf keine Möglichkeit mehr die GUI gezielt zu manipulieren. Einfacher ist es natürlich wenn man alle GUIs und deren Elemente global außerhalb einer Funktion erstellt, dann braucht man sich keinen abbrechen um die einzelnen Variablen innerhalb des Scriptes weiterzureichen.
Hier mal eine erweiterete Variante von Tweakys Script:
Spoiler anzeigen
[autoit]
[/autoit] [autoit][/autoit] [autoit]
#RequireAdmin
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <WinAPI.au3>
#NoTrayIconShellExecute(@ScriptDir & "\setup.exe")
[/autoit] [autoit][/autoit] [autoit]
_window()
_dosomething()Func _window()
[/autoit] [autoit][/autoit] [autoit]
$myGUI = setWinHide("Test", 600, 200, 0, 0)
setText(20, 10, "Groß geschriebener Text", 0x000000, "MS Reference Sans Serif", 30)Do
[/autoit] [autoit][/autoit] [autoit]
Sleep(100)
Until ProcessWaitClose("setup.exe")
guidelete($myGUI) ; löscht deine GUI
EndFunc ;==>_window;myFunction
[/autoit] [autoit][/autoit] [autoit]
Func setText($x, $y, $text, $color = 0x00000D, $fontname = "MS Times New Roman", $textgroesse = 12)
Local $label = GUICtrlCreateLabel($text, $x, $y, StringLen($text) * $textgroesse, $textgroesse * 2)
GUICtrlSetFont($label, $textgroesse, 400, -1, $fontname)
GUICtrlSetColor($label, $color)
EndFunc ;==>setText;Erstellt eine transparente GUI
[/autoit] [autoit][/autoit] [autoit]
Func setWinHide($title, $width, $height, $left, $top)
Local $hGui = GUICreate($title, $width, $height, $left, $top, $WS_POPUP, BitOR($WS_EX_LAYERED, $WS_EX_TOPMOST))
Local $bkcolor = 0xffffff
GUISetBkColor($bkcolor)
DllCall("user32.dll", "int", "SetLayeredWindowAttributes", "hwnd", $hGui, "long", $bkcolor, "byte", 255, "long", 0x03)
GUISetState()
Return $hGUI ; gibt das Handle der GUI zurück
EndFunc ;==>setWinHideFunc _dosomething()
[/autoit] [autoit][/autoit] [autoit];do something
[/autoit] [autoit][/autoit] [autoit]EndFunc ;==>_dosomething
[/autoit] -
Du hast jetzt also eine while Schleife in deinen case eingebaut? Halte ich für groben Unfug. Zur Laufzeit innerhalb der Haupt Schleife noch GUIs zu erstellen oder zu löschen ist unnötig und wird früher oder später zu Komplikationen führen. Stattdessen sollte man alle GUIs und GUI Elemente bevorzugt am Anfang des Scriptes erstellen und bei Bedarf mit guisetstate(...) oder guictrlsetstate(...) ein- bzw. ausblenden. Das vereinfacht zum einen das Handling, zum anderen bleibt dein Code übersichtlicher, weil sämtlicher GUI code an einer Stelle im Script steht.
Um in der While Schleife die Nachrichten der Fenster einer bestimmten GUI zuordnen zu können gibt es den extended mode von guigetmsg().
Beispiel zum extended mode:
Spoiler anzeigen
[autoit]
[/autoit] [autoit][/autoit] [autoit]
#include <GUIConstantsEx.au3>
#include <MsgBoxConstants.au3>Example()
[/autoit] [autoit][/autoit] [autoit]Func Example()
[/autoit] [autoit][/autoit] [autoit]
; Create a GUI.
Local $hGUI1 = GUICreate("Example GUI1")
; Create a button.
Local $idButton1 = GUICtrlCreateButton("Button1", 10, 10, 80, 22)
; Display the GUI
GUISetState(@SW_SHOW, $hGUI1); Create a GUI.
[/autoit] [autoit][/autoit] [autoit]
Local $hGUI2 = GUICreate("Example GUI2", 300, 300)
; Create a button.
Local $idButton2 = GUICtrlCreateButton("Button2", 10, 10, 80, 22)
; Display the GUI
GUISetState(@SW_SHOW, $hGUI2); Initialize a Local variable.
[/autoit] [autoit][/autoit] [autoit]
Local $aMsg = 0While 1
[/autoit] [autoit][/autoit] [autoit]
; Assign to $aMsg the advanced GUI messages.
$aMsg = GUIGetMsg(1); Switch from GUIs
[/autoit] [autoit][/autoit] [autoit]
Switch $aMsg[1]
Case $hGUI1
; The event comes from the GUI1; Switch from event ID
[/autoit] [autoit][/autoit] [autoit]
Switch $aMsg[0]
Case $GUI_EVENT_CLOSE
ExitLoop
Case $idButton1
MsgBox($MB_SYSTEMMODAL, "", "Button1 clicked.")
EndSwitch
Case $hGUI2
; The event comes from the GUI2; Switch from event ID
[/autoit] [autoit][/autoit] [autoit]
Switch $aMsg[0]
Case $GUI_EVENT_CLOSE
GUIDelete($hGUI2)
Case $idButton2
MsgBox($MB_SYSTEMMODAL, "", "Button2 clicked.")
EndSwitch
EndSwitch
WEnd; Delete the previous GUIs and all controls.
[/autoit] [autoit][/autoit] [autoit][/autoit]
GUIDelete($hGUI1)
EndFunc ;==>Example -
Wie du richtig vermutest kann Autoit keine "Wildcard Ordner". Mir war nichtmal bewusst, dass man in Batch code sowas tun kann. Mich würde rein aus Neugierde im übrigen auch dein vollständiger Batch code interessieren, vertrauliche Zugangsdaten kannst du ja vorher entfernen.
Nun zu deiner Aufgabenstellung:
Soweit ich dich verstanden habe gibt es auf dem oder den Systemen wo das Script laufen soll immer nur einen Ordner der dein Suchkriterium erfüllt, wobei der erste Teil des Ordnernamens statisch und auf allen Systemen gleich ist und der letzte Teil variabel ist und auf allen Systemen abweicht. Wie dem auch sei hier eine Liste an Funktionen die für dein vorhaben hilfreich sein dürften:
[autoit]
[/autoit]
#include <file.au3>
#include <array.au3>
_filelisttoarray(...details siehe hilfe...) ; erstellt ein Array mit einer Liste von Dateien und / oder Ordnern, vergleichbar mit dem DOS Befehl "dir"
_arraysearch(...details siehe hilfe...) ; findet Suchbegriffe in einem Array, Teilübereinstimmungen sind auf Wunsch möglich, damit findest du letzlich raus welcher der Ordner dein gesuchter ist
; dann solltest du dir noch Tutorials anschauen wie man in Autoit Strings verkettetEvtl. solltest du dir auch das Array Tutorial von Bugfix anschauen: http://www.bug-fix.info/array_tut.htm
Zu deinen false positiv Virenscanner Ergebnissen sei vielleicht noch erwähnt, dass auch kompilierte Autoit Programme regelmässig von Virenscannern erkannt werden. Jenachdem welche includes man nutzt, ob man 32 oder 64bit verwendet, ob die exe Kompression UPX genutzt wird usw.
-
Zitat von klaros
Wahrscheinlich reicht es nicht über ProcessExists ...
Das hatte ich nämlich zuerst probiert - aber auf einem Server / (PC ?) laufen gleichnamige Prozesse, die unterschiedlichen Usern gehören (wenn mehrere angemeldet sind, oder, wenn sie sich nur getrennt haben, (noch) weiterlaufen).
Mit der Klasse werden eindeutig zur Usersitzung Fenster angesprochen.Ich überlege aber gerade, ob man eine Kombi aus Prozessname und PID probieren könnte ...
Höhö, zeitgleich zu GegX ...

Grüße,
klarosAlso zum einen solltest du als normaler Benutzer ohne Adminberechtigungen ohnehin nur deine eigenen Prozesse sehen können. Somit dürfte es auch kein Problem mit den Prozessen der anderen angemeldeten Benutzer des Servers geben. Aber davon mal ab würde ich mir einfach merken welche Programme ich selber gestartet habe und nur dann einen erneuten Start zulassen wenn die gemerkte eindeutige Prozess ID (PID) nicht mehr existiert.
Simples Beispiel:
Spoiler anzeigen
[autoit]
[/autoit] [autoit][/autoit] [autoit]
#include <Array.au3>
Global $aProzessHistory[1][2] = [ ["PID","Pfad"] ]; Anwendungsbeispiele:
[/autoit] [autoit][/autoit] [autoit]StartProgramm("notepad.exe")
[/autoit] [autoit][/autoit] [autoit]
StartProgramm("mspaint.exe")
StartProgramm("calc.exe")MsgBox(262144,"debug","Alle Programme wurden gestartet, zur Kontrolle wird das Array jetzt angezeigt. Bitte eines der Programme beenden, im nachfolgenden Schritt sollte dann nur dieses eine Programm neugestartet werden.")
[/autoit] [autoit][/autoit] [autoit]
_ArrayDisplay($aProzessHistory)$debug = StartProgramm("notepad.exe")
[/autoit] [autoit][/autoit] [autoit]
ConsoleWrite("DEBUG: Rückgabecode --> " & $debug & @CRLF) ; 1 oder -1, jenachdem ob das Programm gestartet wurde oder nicht
$debug = StartProgramm("mspaint.exe")
ConsoleWrite("DEBUG: Rückgabecode --> " & $debug & @CRLF) ; 1 oder -1, jenachdem ob das Programm gestartet wurde oder nicht
$debug = StartProgramm("calc.exe")
ConsoleWrite("DEBUG: Rückgabecode --> " & $debug & @CRLF) ; 1 oder -1, jenachdem ob das Programm gestartet wurde oder nichtSleep(2000)
[/autoit] [autoit][/autoit] [autoit]
_ArrayDisplay($aProzessHistory)Func StartProgramm($sPath)
[/autoit] [autoit][/autoit] [autoit]
; Startet beliebige Programme und speichert die PID + Pfad im globalen Array $aProzessHistory.
; Wenn der übergebene Pfad bereits im Array vorhanden ist und der zugehörige Prozess noch läuft wird die Funktion abgebrochen und das Programm wird nicht erneut gestartet.For $i = 1 To UBound($aProzessHistory)-1
[/autoit] [autoit][/autoit] [autoit]
If $aProzessHistory[$i][1] = $sPath Then ; Prozess wurde schonmal gestartet, prüfen ob Prozess beendet wurde oder noch läuft
If processexists($aProzessHistory[$i][0]) Then
Return -1 ; Prozess wurde bereits gestartet und läuft auch noch, kein erneuter Start notwendig, daher Abbruch der Funktion
Else
_ArrayDelete($aProzessHistory,$i); Eintrag aus dem Array entfernen, da Prozess nicht mehr existiert
ExitLoop ; Schleife verlassen, da Prüfung erfolgreich abgeschlossen
EndIf
EndIf
Next; Hier gehts nur weiter wenn der Prozess noch nie gestartet wurde oder nicht mehr läuft...
[/autoit] [autoit][/autoit] [autoit]
Local $sPID = Run($sPath)
ReDim $aProzessHistory[UBound($aProzessHistory)+1][2] ; erweitert das Array um eine neue Zeile
$aProzessHistory[Ubound($aProzessHistory)-1][0] = $sPID ; schreibt die PID in die neue letzte Zeile des Arrays
$aProzessHistory[Ubound($aProzessHistory)-1][1] = $sPath ; schreibt den Programmpfad in die neue letzte Zeile des ArraysReturn 1 ; alles erfolgreich erledigt
[/autoit] [autoit][/autoit] [autoit]EndFunc
[/autoit] -
Das hat nichts mit Windows 8 zu tun, sondern betrifft genauso Windows 7. Du benötigst zusätzlich zum Style $WS_SIZEBOX auch den Style $WS_MAXIMIZEBOX damit die seit Windows 7 bekannte Funktion zum automatischen "Teilvollbild" funktioniert. Achja kleiner Tipp fürs nächstemal... poste bitte zukünftig ein lauffähiges Script mit dem man den Fehler nachvollziehen und eine Lösung testen kann. Nicht jeder hat Bock nur wegen deinem Problem erstmal eine GUI mit Koda zu erstellen.
-
Beim überfliegen deines Quellcodes (Achja wie wäre es wenn du den anderen Thread hier verlinken würdest? Dann braucht man nicht erst selbst danach suchen...), hier mal eine potentielle Fehlerquelle beim Ansprechen eines Arrays...
In deinem include "_VSDesktopIcons.au3":
Zeile 64ff
[autoit]
[/autoit]
If ($ProgName <> "leer") Then ;==> Hilfskonstrukt - muss in der INI angeben sein, falls eine Section / Kachel keine Icons enthält
$aSplittedString = StringSplit($aSectionInfo[$j][1],"|") ;==> String aufteilen, Trennzeichen "|"
If @error = 1 Then
MsgBox(48,'Fehler','Fehler in der INI-Datei: Trennzeichen nicht korrekt!',0)
Exit
EndIf
$aProgName[$ProgNr] = $ProgName ;== Programmname - wird vielleicht noch gebraucht (ToolTip ...)
$aProgPath[$ProgNr] = $aSplittedString[1] ;==> Programmpfad
$aClassName[$ProgNr] = $aSplittedString[3] ;==> ClassenName des Programmes
Local $IconPicInfo = $aSplittedString[2] ;==> Icon / Bild (Pfad)Du prüfst hier zwar ob es einen grundsätzlichen Fehler beim stringsplit gab, aber nicht ob die erwartete Ergebnismenge auch wirklich vorhanden ist. Wird der String nur in zwei statt in drei Teile zerlegt wird dein Script beim Ansprechen des dritten Array Indexes abstürzen.
Mehr Problemstellen sind mir auf Anhieb jetzt nicht aufgefallen, du scheinst durchgehend recht gründlich auf Fehler zu prüfen.
-
Naja ich würde mal vermuten, dass die Funktion _FB_Request() dir genau das zurückgibt was die FB auf dein GET antwortet. Sprich das was du suchst dürfte wohl in der Variable $result stehen, zumindestens wenn dein Request erfolgreich war.
-
Zitat
$BlockSize ist doch aber eine Konstante, nach meinem Verständnis wird hier immer wieder der selbe Teil von $OpenHandle in $ByteBlock eingelesen.??
Nein eben nicht. Wenn du dir das Beispiel zu fielread in der Hilfe anschaust wirst du sehen, dass bei jedem erneuten Lesen aus der noch offenen Datei immer die nächsten X Zeichen/Byte gelesen werden solange bis fileread einen Fehler meldet (End of file). Das funktioniert allerdings nur wenn man mit filehandles (fileopen) arbeitet und die Datei "geöffnet" bleibt. Sobald die Datei geschlossen wird (fileclose) werden zukünftige Leseversuche wieder beim ersten Zeichen/Byte anfangen. Bedeutet also wenn man statt einem Handle einen Dateipfad an fileread in der Schleife übergibt kann man so tatsächlich immer nur den gleichen Anfangsteil auslesen, da fileread in diesem Fall automatisch ein fileopen und fileclose durchführt.
-
SID steht nicht für Sensor ID sondern für Session ID. Dieser Teil des GET commandos wird sich also vermutlich bei jedem Aufruf der API ändern. Ohne Dokumentation der Session ID kann man aber kaum etwas dazu sagen wie man diese erhält/ermittelt oder ob man diesen Parameter überhaupt zwingend angeben muss. Die AIN ist wohl eher das was du unter Sensor ID verstehst und identifiziert das zu steuernde Gerät.
-
Wo ist das Problem? Du hast doch bereits mindestens 2 andere Threads erstellt in denen es ebenfalls um die Automatisierung von Webseiten ging. Ohne diese Threads nochmal gelesen zu haben würde ich vermuten, dass du sowohl auf die Funktionen der ie.au3 als auch auf die UDF winhttp.au3 hingewiesen wurdest. Für einfache GET Requests braucht man aber nicht wirklich die winhttp.au3 und prinzipiell noch nicht einmal die ie.au3. Man kann stattdessen auch einfach nur die URL im Standardbrowser öffnen oder was vielleicht noch wesentlich eleganter wäre wäre wohl der Einsatz von inetread.
EDIT:
Man sollte AVM vielleicht auch mal darauf hinweisen, das die externe Referenz bzgl. dem Aufbau der SID in ihrer Dokumentation auf einen nicht (mehr) existierenden Link verweist... -
Ich habe leider keine Erfahrung mit multiplen Domänen, aber soweit ich dich verstanden habe kannst du durchaus aus Domäne1 auf ein Networkshare aus Domäne2 zugreifen, solange du die korrekten Logindaten für den jeweiligen Networkshare angibst. Also es wäre dir z.B. möglich von Hand Netzlaufwerke aus der fremden Domäne einzubinden. Habe ich das soweit richtig verstanden?
Sollte das so zutreffend sein schlage ich dir vor einen dieser Wege anzusehen:
1. Lagere die Scriptteile die in beliebigen/unterschiedlichen Benutzerkontexten laufen sollen in eine separate Scriptdatei aus. Aus deinem Hauptscript rufst du dieses "worker script" mit runas im jeweils richtigen Userkontext auf und übergibst als Parameter den UNC Pfad der geprüft/gelöscht werden soll.
2. Verwende DriveMapAdd um die Netzlaufwerke im jeweils passenden Benutzerkontext zu verbinden. Anschließend deine Prüf-/Löschroutine auf die verbundenen Laufwerke loslassen und danach die Laufwerke wieder mit DriveMapDel trennen.
Beide Varianten sollten funktionieren, du benötigst aber eben die jeweils passenden Accountdaten für alle Networkshares. Zur Vereinfachung würde ich wohl in allen Domänen einen gleichnamigen Benutzer mit gleichem Passwort dafür verwenden und im Script dann nur noch das Domänen Prefix variabel halten.