Vielleicht noch als zusätzliche Hilfestellung: Wenn du eckige Klammern "[ ]" in einer Funktionsbeschreibung findest bedeutet es das diese Parameter optional sind (einen vordefinierten Wert haben). Wenn du sie aber setzt machst du das wie mit "normalen" Parametern. Das heißt du schreibst die Eckigen klammern nie in den Funktionsaufruf.
Beiträge von stro
-
-
Du kannst praktisch jeden Installer mit Tastaturbefehlen durchlaufen.
Vielleicht fällt es dir ja leichter das ganze mit ControlSend() umzusetzen, da brauchst du im Prinzip nicht mal die IDs kennen sondern nur deine Tastendrücke in richtiger Reinfolge (TAB, Enter, Leertaste zum anhacken). Hab damit schön des öfteren Fenster ferngesteuert die nicht aktiv waren.Gruß
stro -
Guten Abend,
ich hab mir ein schickes Script geschrieben, dass ohne GUI auskommt und den Status über das Trayicon ausgibt (TraySetIcon). Das Script nutzt die Funktion _INetGetSource aus der INet.au3, welche wiederum InetRead() verwendet.
Wenn InetRead() arbeitet blitzt kurz eine Sanduhr (in W7 halt den tollen Kreis) am Cursor auf.
Da das Script unauffällig im HIntergrund einen Status zu überwachen soll, ruft das Script alle 10 Sekunden 3 URLs auf.Jedesmal wenn das Script losgeht blitzt 3 mal hintereinander kurz die Eieruhr am Cursor auf.
Dazu zwei Fragen:
1. Wieso gibt es / bekomme ich überhaupt global eine Sanduhr, gewhönlich bekomme ich sie bei Programmen mit GUI auch nicht zu sehen wenn ich den Cursor aus dem aktiven Fenster herausziehe.
Wenn ich zum Beispiel im Explorerfenster eine Suche starte bekomme ich die Sanduhr zwar solange sich der Cursor im Explorerfenster befindet, außerhalb aber nicht.
2. Gibt es Möglichkeiten der Abhilfe? Leider macht es die ganze Mühe die ich mir gemacht habe das Script komplett über das Trayicon zu steuern und die Statusanzeige darüber laufen zu lassen völlig zu nichte, da es auf normalen Anwender PCs laufen soll und nicht auf einem Server. Beim Texte lesen, surfen, etc. ist ein aufblitzen und zucken im 10 Sekundentakt nicht zumutbar.
Wenn da jemand was auf dem Hut zaubert wäre das wirklich grandios. Meine Suche nach Lösungsansätzen blieb bis jetzt ohne Erfolg.
Beste Grüße
stro -
Also ganz ehrlich Surfy, ich versteh den Aufwand den du treibst nicht.
Das ein Benutzer nach eine Programmmigration ausgeloggt wird halte ich in nicht kritischen Arbeitsbereichen für ziemlich normal.
Wirf dem Benutzer nach der Installation oder ab einem gewissen Prozessfortschrit eine Nachricht auf den Bildschrim, dass er alle offenen Dateien speichern soll und in 5 Minuten ausgeloggt wird. Fertig ist die Kiste.
Was hast du davon Stunden zu investieren wenn du damit den einzelnen nur Minuten sparst?
Ich weiß ja nicht ob du vor hast Office 2010 im AKW aufzuspielen oder ob deine Benutzer 24/7 online sein müssen.
Aber wenn du sagst, das es ohnehin nachts passieren soll und dann nur noch ein paar Nasen da sind ist das glaube ich durchaus vertretbar.
Bisschen an deiner Frage vorbei, aber dass musste jetzt mal rausGruß
stro -
Macht es in deinem Fall vielleicht Sinn, dass nicht vom Programm bestimmen zu lassen, sondern das System diese Aufgabe erledigen zu lassen.
Du könntest das Script ohne Schleife, nack wie dus oben hast, per CronJob(Linux)/Taskplaner(Windows) aufrufen lassen.
Das hat den Vorteil, dass du den Aufruf an verschiedenste Ereignisse koppeln kannst. Zum Beispel starte nachdem Programm x beendet wurden.
Oder ausführen wenn User sich einloggt und dannach alle x Minuten.
Genauso kannst du aber auch Bedingungen Prüfen und die Ausführung des Scriptes danach verweigern. Zum Beispeil wenn der Benutzer nicht eingeloggt ist.Gruß
stroEdit: misterspeed: Sitzung beenden und neustarten würde ja sogar schon reichen.
-
Hallo Ilse,
das soll jetzt wirklich kein anmuffen sein, trotzdem empfehle ich dir mal ein Grundlagentutorial zum Programmieren durchzuarbeiten.
Das ist der zweite Thread in kürzester Zeit, bei dem zu erkennen ist, dass du massive defizite bei den Grundlagen hast.
Merke dir für Dateizugriffe schonmal dieses Schema.1. Datei Öffnen [$fp = FileOpen('Dateiname',0) ; (mode 0 zum lesen öffnen)]
2. Datei Lesen [FileRead($fp)]
3. Datei Datei Schließen [FileClose($fp)]
4. Dateiinhalt verarbeiten [Wichtig, dies geschieht immer nur in deinem Programm und nicht in der Datei, desshalb
5. Datei Öffnen [FileOpen('Dateiname',2); (mode 1 (an Dateiinhalt anhängen) oder 2 (Datei leeren und in leere Datei schreiben)]
6. Datei Schreiben [FileWrite($fp,'Daten')Zu deiner Verwendung von Filepointern die misterspeed anspricht habe ich dir in deinem anderen Thread noch ausführliche Kommentare an deinen Quelltext geschrieben.
Gruß
stro -
[autoit]
[/autoit]
$sSource = FileOpen(@ScriptDir & "\test2.txt", 0) ;Öffnet die Datei mit Lesezugriff und speichert einen Filepointer in $sSource (Bsp. 23)
$sSource = FileRead($sSource) ;FileRead speichert den Inhalt der Datei auf die der Pointer verweist in $sSource (Bsp. Abcd)
$rep = StringReplace($sSource, "Hier stehen die Zeichen die im Forum leider nicht gezeigt werden", " ")
FileWrite($sSource, $rep) ;FileWrite() wird mit ungültigen Parametern aufgerufen. In $sSource steht nun der Inhalt der Datei und der Filepointer ist nicht mehr vorhanden. Ausserdem wurde die Datei in Zeile 1 mit dem Parameter 0 geöffnet => Nur zum lesen.
FileClose($sSource) ;FileClose wird mit ungültigen Parametern aufgerufen. In $sSource steht nun der Inhalt der Datei und der Filepointer ist nicht mehr vorhanden.
[autoit]
Generell ist diese Art auch sehr unsauber. Einen Filepointer, solltest du niemals mit anderen Werten überschreiben.
Dann sieht das ganze so aus.
[/autoit]
$fp = FileOpen(@ScriptDir & "\test2.txt",2) ;$fp für filepointer. Gängig wäre auf $fp_test2 wenn der Handle länger verwendet werden soll um die Übersicht zu wahren. Wichtig hier, datei wird nur zum lesen geöffnet.
$sSource = FileRead($fp) ;FileRead speichert den Inhalt der Datei auf die $fp verweist in $sSource
FileClose($fp) ;Schließen der Datei, da lesen beendet wurde.
$rep = StringReplace($sSource, "Hier stehen die Zeichen die im Forum leider nicht gezeigt werden", " ")
$fp = FileOpen(@ScriptDir & "\test2.txt",2) ;Datei wird erneut geöffnet, diesmal aber mit schreibzugriff. Hierbei kann die selbe $fp Variable benutzt werden, da wir Zeile 4 die Offene Datei bereits geschlossen haben und er $fp damit wieder "frei" ist.
FileWrite($fp, $rep) ;FileWrite() schreibt die Daten in die Datei.
FileClose($$fp) ;Datei wird wieder geschlossen. -
Wo kommt die Liste denn her die du übergibst?
Wird sie jedemal frisch erstellt, nachdem du eine Datei gelöscht hast? Wenn nicht, ist klar das deine Funktion alte Daten prüft.
Eventuell könnte dir auch _ArraySort() weiterhelfen. (Allerdings wieder vorausgesetzt, deine Liste spiegelt den aktuellen Zustand auf deiner Platte wieder.)
Was hältst du eigentlich von der Idee einer "Vorprüfung". Du könntest beispielsweise einen Hash von Quell und vom Zielornder erstellen und diesen vergleichen.
Das wäre im Erfolgsfall wohl die schnellste und zuverlässigste Methode.
Dann müsstest du deine Filelist nur neu erstellen, wenn die Prüfung nicht erfolgreich war.
Für einen MD5 Hash habe ich folgende Links gefunden -
Wenn du die Datei schreibst fügst du am ende ein @CRLF an
Spoiler anzeigen
[autoit]FileWriteLine($datei, $neu[$i] & @CRLF)
[/autoit]Wenn du die Datei dann mit FileReadLine() einließt werden alle newlines am Ende automatisch abgeschnitten, nicht aber der Carriage Return (CR)
Ausschnitt aus dem Hilfetext dazuSpoiler anzeigen
Returns the text of the line read, any newline characters ( CHR(10) or @LF ) at the end of a line read in are automatically stripped.
http://www.autoitscript.com/autoit3/docs/f…ileReadLine.htmDas heißt, beim einlesen musst du nur noch @CR anfügen.
Spoiler anzeigen
[autoit]FileWriteLine($datei, $neu[$i] & @LF)
[/autoit]Kleiner hat das auch schon gepostet, aber dmit wirds vielleicht noch verständlicher
-
Danke für das gute Auge misterspeed, da hätten wir ja mal nen typischen Anfängerfehler gefunden. Profis nennen das dann Flüchtigkeitsfehler
Das Script von autoBert werde ich mir später auch noch anschauen.
Thread wär dann hiermit als gelöst zu betrachten.Vielen Dank
stro -
Das ist ja grade der Oberwitz. Ich habe mir schon vor dem Post hier alle Werte anzeigen lassen (unkomfortabel mit Messageboxen allerdings) und die Codezeile wird devinitiv mit den richtigen Parametern ausgefürt. Einzig der DirMove Befehl gibt 0 zurück => wird aufgerufen, ist aber nicht durchführbar.
Ich habe nun auch den von AutoBert geschriebenen code getestet und komme zum selben Ergebnis, DirMove gibt 0 zurück und die Operation wird nicht ordnungsgemäß ausgeführt.
Auch die Pfadangaben habe ich nun unzähligemale überpfrüft. Zusätzlich habe ich den Codeabschnitt nochmals autonom für sich ausgeführtSpoiler anzeigen
[autoit];Test von AutoBerts Codeabschnitt ohne Programmgerüst
[/autoit] [autoit][/autoit] [autoit]
Global $path = 'C:\Spiele\League of Legends'
Func GetCurrentClient()
$fp = FileOpen($path&'\RADS\projects\lol_air_client_config_eu\releases\0.0.0.1\deploy\lol.properties')
$fr = FileReadLine($fp,2)
If (StringRight($fr,20) == 'eu.lol.riotgames.com') Then
Return 'EU'
ElseIf (StringRight($fr,22) == 'beta.lol.riotgames.com') Then
Return 'NA'
Else
Return False
EndIf
EndFuncFunc SwapCurrentClient($swapto)
[/autoit] [autoit][/autoit] [autoit]
ConsoleWrite("Swap To: " & $swapto & @crlf)
$sCurrent = GetCurrentClient()
ConsoleWrite("Current: " & $sCurrent & @crlf)If $swapto = $sCurrent Then
[/autoit] [autoit][/autoit] [autoit]
Return True
Else
ConsoleWrite(DirMove($path & '\RADS\projects\lol_air_client_config_eu', $path & '\RADS\projects\lol_air_client_config_eu1')&@CRLF)
ConsoleWrite(DirMove($path & '\RADS\projects\lol_air_client_config_na', $path & '\RADS\projects\lol_air_client_config_eu')&@CRLF)
ConsoleWrite(DirMove($path & '\RADS\projects\lol_air_client_config_eu1', $path & '\RADS\projects\lol_air_client_config_na')&@CRLF)
ConsoleWrite(GetCurrentClient()&@CRLF)
Return True
EndIf
EndFunc ;==>SwapCurrentClientSwapCurrentClient('NA')
[/autoit]
Exit
Die console spuckt dann dazu folgendes aus => geht nichtSpoiler anzeigen
Code
Alles anzeigen>"C:\Tools\AutoIt\SciTe\AutoIt3Wrapper\AutoIt3Wrapper.exe" /run /prod /ErrorStdOut /in "C:\Users\s7r0\Desktop\Scripts\Portal Tool\test.au3" /autoit3dir "C:\Program Files (x86)\AutoIt3" /UserParams +>17:28:18 Starting AutoIt3Wrapper v.2.0.1.24Environment(Language:0407 Keyboard:00000407 OS:WIN_7/Service Pack 1 CPU:X64 OS:X86) >Running AU3Check (1.54.19.0) from:C:\Tools\AutoIt +>17:28:18 AU3Check ended.rc:0 >Running:(3.3.6.1):C:\Tools\AutoIt\autoit3.exe "C:\Users\s7r0\Desktop\Scripts\Portal Tool\test.au3" Swap To: NA Current: EU 0 0 0 EU +>17:28:19 AutoIT3.exe ended.rc:0 >Exit code: 0Time: 2.027
Wenn ich allerdings wieder alles drum herum wegnehme und nur die nackten Anweisungen verwende funzt allesSpoiler anzeigen
[autoit]$path = 'C:\Spiele\League of Legends'
[/autoit]
ConsoleWrite(DirMove($path & '\RADS\projects\lol_air_client_config_eu', $path & '\RADS\projects\lol_air_client_config_eu1')&@CRLF)
ConsoleWrite(DirMove($path & '\RADS\projects\lol_air_client_config_na', $path & '\RADS\projects\lol_air_client_config_eu')&@CRLF)
ConsoleWrite(DirMove($path & '\RADS\projects\lol_air_client_config_eu1', $path & '\RADS\projects\lol_air_client_config_na')&@CRLF)
Exit
Wie die Console es belegtSpoiler anzeigen
Code>"C:\Tools\AutoIt\SciTe\AutoIt3Wrapper\AutoIt3Wrapper.exe" /run /prod /ErrorStdOut /in "C:\Users\s7r0\Desktop\Scripts\Portal Tool\test.au3" /autoit3dir "C:\Program Files (x86)\AutoIt3" /UserParams +>17:33:41 Starting AutoIt3Wrapper v.2.0.1.24Environment(Language:0407 Keyboard:00000407 OS:WIN_7/Service Pack 1 CPU:X64 OS:X86) >Running AU3Check (1.54.19.0) from:C:\Tools\AutoIt +>17:33:41 AU3Check ended.rc:0 >Running:(3.3.6.1):C:\Tools\AutoIt\autoit3.exe "C:\Users\s7r0\Desktop\Scripts\Portal Tool\test.au3" 1 1 1 +>17:33:41 AutoIT3.exe ended.rc:0 >Exit code: 0Time: 1.522
Ich kann es mir einfach nicht eklären... -
Grande, dass mit dem case sensitivebez. nicht wusste ich auch noch nicht.
Und ja ich komme ursprünglich aus der C Welt
Allerdings möchte ich es immer noch verstehen. Wenn ich das doch richtig sehe, ist der einzige Unterschied zu meinem Code, das die If Abfrage nicht direkt mit dem Rückgabewert von GetCurrentClient() verglichen wird, sondern zuvor in $sCurrent zwischengespeichert wird.
Richtig, falsch?!Danke
stro -
Danke, danke
leider muss ich noch ein wenig warten bis ich Zeit zum Testen habe, denke das wird heute Nachmittag sein.
Wenn ich das auf die Schnelle richitg sehe heißt das ich muss mein Ergebniss zum Vergleichen zwingend in einer Variable zwischenspeichern, bevor ich es prüfen kann?!
Außerdem scheint mir in Zeile 4 deiner Lösung noch ein = zu fehlen. Müsste es nicht == sein statt = wenn ich damit eine If abfrage startelg
stro -
Hallo,
aus langer Erfahrung weiß ich "Der Computer hat immer recht", doch nun bin ich wieder an einem Punkt angelangt, an dem ich ihm das nicht so wirklich glauben mag.
Ich habe ein kleines Progrämmchen geschrieben, dass eigentlich nichts anderes macht als den Namen von <Ordner A> und <Ordner B> zu tauschen.
Damit lässt sich das Spiel League of Legends von EU auf NA (north American) umstellen und zurück.
Das passiert in den Zeilen 54-56. Der Code wird ausgeführt und alle Parameter stimmen, das habe ich ausgiebig getestet. Problem an der Kiste: DirMove gibt 0 zurück und der Kopiervorgang wird auch nicht ausgeführt.
Der eigentlich interessante Teil kommt jetzt. Wenn ich die 3 Zeilen Code in eine Leere .au3 packe, in der Zeile davor $path deklariere und ein Exit in die letzte schreibe läuft der Code einwandfrei durch und die Kopiervorgänge werden anstandslos durchgeführt.
Da bin ich jetzt wirklich mit meinem Latein am Ende.
Wenn jemand eine schlaue Erklärung für dieses Verhalten hat bin ich dafür sehr dankbar.Gruß
stroEdit: Ich hoffe ich habe den Beitrag jetzt nicht doppelt gepostet. Ansonsten bitte ich ein Mod das Missgeschick zu bereinigen. Danke!
Originalcode:
Spoiler anzeigen
[autoit];LoL Swapper
[/autoit] [autoit][/autoit] [autoit]
#include <ButtonConstants.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>Global $path = ''
[/autoit] [autoit][/autoit] [autoit]#Region ### START Koda GUI section ### Form=
[/autoit] [autoit][/autoit] [autoit]
$frm_Main = GUICreate("LoL Swapper", 194, 66, 774, 500)
$Group_Control = GUICtrlCreateGroup("Control Panel", 0, 0, 193, 65)
$Radio_EU = GUICtrlCreateRadio("EU", 8, 16, 41, 17)
$Radio_NA = GUICtrlCreateRadio("NA", 8, 40, 33, 17)
$Button_Apply = GUICtrlCreateButton("Apply", 48, 16, 57, 41, $WS_GROUP)
$Label_Headlineclient = GUICtrlCreateLabel("Current client", 112, 16, 66, 17)
GUICtrlSetFont(-1, 8, 400, 4, "MS Sans Serif")
$Label_CurrentClient = GUICtrlCreateLabel("default", 136, 37, 21, 17)
GUICtrlSetFont(-1, 8, 800, 0, "MS Sans Serif")
GUICtrlSetColor(-1, 0xFF0000)
GUICtrlCreateGroup("", -99, -99, 1, 1)
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ####Region ### START UDF ###
[/autoit] [autoit][/autoit] [autoit]
Func GetCurrentClient()
$fp = FileOpen($path&'\RADS\projects\lol_air_client_config_eu\releases\0.0.0.1\deploy\lol.properties')
$fr = FileReadLine($fp,2)
If (StringRight($fr,20) == 'eu.lol.riotgames.com') Then
Return 'EU'
ElseIf (StringRight($fr,22) == 'beta.lol.riotgames.com') Then
Return 'NA'
Else
Return False
EndIf
EndFuncFunc PostCurrentClient($client)
[/autoit] [autoit][/autoit] [autoit]
Switch $client
Case 'EU'
GUICtrlSetState($Radio_EU,$GUI_CHECKED)
GUICtrlSetData($Label_CurrentClient,'EU')
Case 'NA'
GUICtrlSetState($Radio_EU,$GUI_CHECKED)
GUICtrlSetData($Label_CurrentClient,'NA')
Case False
GUICtrlSetData($Label_CurrentClient,'ERROR')
EndSwitch
EndFuncFunc SwapCurrentClient($swapto)
[/autoit] [autoit][/autoit] [autoit]
If $swapto == GetCurrentClient() Then
Return True
Else
DirMove($path&'\RADS\projects\lol_air_client_config_eu',$path&'\RADS\projects\lol_air_client_config_eu1')
DirMove($path&'\RADS\projects\lol_air_client_config_na',$path&'\RADS\projects\lol_air_client_config_eu')
DirMove($path&'\RADS\projects\lol_air_client_config_eu1',$path&'\RADS\projects\lol_air_client_config_na')
PostCurrentClient(GetCurrentClient())
Return True
EndIf
EndFunc
#EndRegion ### END UDF ####Region ### START Program initialization ###
[/autoit] [autoit][/autoit] [autoit]
If FileExists("LoL Swapper.ini") Then
$path = IniRead("LoL Swapper.ini", "General", "Path", "...")
Else
Do
$path = FileSelectFolder("Select League of Legends folder","",4,'C:\Spiele\League of Legends')
If FileExists($path&'\lol.launcher.exe') Then
$loop = False
Else
MsgBox(48,'Error!','Could not find lol.launcher.exe in selected folder')
$loop = True
EndIf
Until $loop == False
IniWrite("LoL Swapper.ini", "General", "Path",$path)
EndIfPostCurrentClient(GetCurrentClient())
[/autoit] [autoit][/autoit] [autoit]
#EndRegion ### END Program initialization ###While 1
[/autoit]
$nMsg = GUIGetMsg()
Switch $nMsg
Case $GUI_EVENT_CLOSE
Exit
Case $Button_Apply
If GUICtrlRead($Radio_EU) == $GUI_CHECKED Then
MsgBox(0,'','Send EU')
SwapCurrentClient('EU')
ElseIf GUICtrlRead($Radio_NA) == $GUI_CHECKED Then
MsgBox(0,'','Send EU')
SwapCurrentClient('NA')
EndIf
EndSwitch
WEndKopierter Einzelteil
Spoiler anzeigen
[autoit]$path = 'C:\Spiele\League of Legends'
[/autoit]
DirMove($path&'\RADS\projects\lol_air_client_config_eu',$path&'\RADS\projects\lol_air_client_config_eu1')
DirMove($path&'\RADS\projects\lol_air_client_config_na',$path&'\RADS\projects\lol_air_client_config_eu')
DirMove($path&'\RADS\projects\lol_air_client_config_eu1',$path&'\RADS\projects\lol_air_client_config_na')
Exit