Beiträge von Bitnugger
-
-
-
Dim, Global und Local
Mir fällt immer wieder auf, dass viele User die Aussage machen, das Dim nicht mehr benutzt werden sollte, obwohl in der AutoIt-Hilfe kein Wort diesbezüglich zu finden ist.
Auch jetzt aktuell sehe ich hierim Forum, dass es bez. Dim & Co. noch Fehlinterpretationen/Unklarheiten gibt und die Spezialfälle bei Global/Local wohl noch nicht allen bekannt sind.
In der Hilfe steht lediglich:
Schlüsselwort Dim / Global / Local / ConstDer Unterschied zwischen Dim, Local und Global ist der Gültigkeitsbereich, für den die Variablen deklariert werden:
Dim = Wenn der Variablename nicht schon mit globalem Gültigleitsbereich existiert, hat die definierte Variable einen lokalen Gültigkeitsbereich (falls die Variable schon global existiert, so wird die globale Variable verwendet.)
Global = Erzwingt globale Gültigkeit der Variablen *
Local = Erzwingt lokale Gültigkeit der Variablen, bzw. innerhalb der Funktion *Man sollte Local oder Global anstelle von Dim verwenden, um explizit den Gültigkeitsbereich für die Variable / Konstante / Array festzulegen.Die Betonung liegt hier auf "um explizit"! Anderfalls kann Dim verwendet werden... dann wird der Gültigleitsbereich automatisch ermittelt, wie es weiter oben bereits erklärt wurde.
* nicht immer... hier ein paar Bsp.:AutoIt
Alles anzeigenOpt('MustDeclareVars', 1) Global $FO = '%s %-20s: $%-6s (Scope: %2i = %-7s) = "%s"\n' Local $sLocal = 'Local ==>> Global' _Test() ;~ _PrintVarInfo('+', ' $sTest', $sTest, 'sTest') ; ==>> Funktioniert nicht wegen Opt('MustDeclareVars', 1)! _PrintVarInfo('@', ' $sTest', IsDeclared('sTest'), 'sTest') ; ==>> ...obwohl sie, wie hier zu sehen ist, als globale Variable deklariert ist! Func _Test() Local $sTest = 'Local', $sVarname = 'sTest', $iScope = IsDeclared($sVarname) ConsoleWrite(StringFormat($FO, '+', 'Local $sTest', 'sTest', $iScope, _GetScopeName($iScope), $sTest)) ConsoleWrite(StringFormat($FO, '+', 'Local $sTest', $sVarname, $iScope, _GetScopeName($iScope), $sTest)) _PrintVarInfo('>', 'Local $sTest', $sTest, 'sTest') Global $sTest = 'Global' ConsoleWrite(StringFormat('\n' & $FO, '!', 'Global $sTest', 'sTest', $iScope, _GetScopeName($iScope), $sTest)) ; ==>> wird nicht ausgeführt/erzwungen, weil es bereits eine gleichgnamige Variable mit lokalem Scope in der Funktion _Test gibt! _PrintVarInfo('+', 'Global $sTest', $sTest, 'sTest') ; ==>> wird ausgeführt/erzwungen, weil es keine gleichgnamige Variable mit lokalem Scope in der Funktion _PrintVarInfo gibt! Dim $sTest = 'Dim' _PrintVarInfo('-', 'Dim $sTest', $sTest, 'sTest') _PrintVarInfo('!', 'Local $sLocal', $sLocal, 'sLocal') ; ==>> Mit Local können nur innerhalb einer Funktion lokale Variablen erstellt werden! ; ==>> Werden Variablen im globalen Scope (außerhalb einer Funktion) deklariert, sind sie immer global! EndFunc Func _GetScopeName($iScope) Return $iScope = 1 ? 'Global' : $iScope = -1 ? 'Local' : 'Unknown' EndFunc Func _PrintVarInfo($sColor, $sHint, $vVar, $sVarname) Local $iScope = IsDeclared($sVarname) ConsoleWrite(StringFormat($FO, $sColor, $sHint, $sVarname, $iScope, _GetScopeName($iScope), $vVar)) EndFunc ; + Local $sTest : $sTest (Scope: -1 = Local ) = "Local" ; + Local $sTest : $sTest (Scope: -1 = Local ) = "Local" ; > Local $sTest : $sTest (Scope: 0 = Unknown) = "Local" ; ; ! Global $sTest : $sTest (Scope: -1 = Local ) = "Local" ; + Global $sTest : $sTest (Scope: 1 = Global ) = "Local" ; - Dim $sTest : $sTest (Scope: 1 = Global ) = "Dim" ; ! Local $sLocal : $sLocal (Scope: 1 = Global ) = "Local ==>> Global" ; @ $sTest : $sTest (Scope: 1 = Global ) = "1"
-
-
In meinem Post #2 habe ich dir mit dem Link zu Microsoft bereits die nötige Information an die Hand gegeben, um verstehen zu können, was es mit dem Standby-RAM auf sich hat und warum es totaler Schwachsinn ist, die Freigabe dieses RAMs mit Gewalt erzwingen zu wollen.
"Standby" heißt, dass dort Systemdateien vorgeladen werden, die häufig genutzt werden, damit sie schneller zur Verfügung stehen. Wird der Speicher für andere Dinge benötigt, wird er in Nanosekunden freigegeben. Daher wird der "Standby" Speicher auch grundsätzlich zum verfügbaren Speicher hinzugezählt. Er ist sofort verfügbar, wenn er gebraucht wird. Du hast somit an sich kein RAM Problem.
Ja, und wo ist dein Script? Ohne ist das hier nur ein Ratespiel...
Übrigens: Lernresistenz wird nicht belohnt!
-
Was hältst Du davon, dies als (Ergänzungs-)Vorschlag im aktuellen AutoIt-Hilfethread zur Diskussion zu stellen.
Wenn du mir einen Link zu diesem Thread gibst, werde ich es machen...
-
Dim gilt es in der Tat zu vermeiden (so steht es auch in der Hilfe zu Dim ) :
Ja... ist in meinen Augen aber völliger Quatsch.
"Man sollte Local oder Global anstelle von Dim verwenden, um explizit den Gültigkeitsbereich für die Variable / Konstante / Array festzulegen."
Ja... wenn ich den Gültigkeitsbereich explizit festlegen will... doch wenn ich es nicht will, kommt Dim ins Spiel... denn gibt es die Variable bereits im globalen Scope, wird dieser verwendet, anderfalls wird eine lokale Variable erzeugt - und somit hat Dim sehr wohl eine Lebensberechtigung!
AutoIt
Alles anzeigenGlobal $iTest1 = 1 ConsoleWrite('> Global: $iTest1 = ' & $iTest1 & ' IsDeclared = ' & IsDeclared('iTest1') & @CRLF) ; 1 = Global, -1 = Local, 0 = Unknown _Test() Func _Test() Dim $iTest1 = 2 Dim $iTest2 = 3 ConsoleWrite('! Func : $iTest1 = ' & $iTest1 & ' IsDeclared = ' & IsDeclared('iTest1') & @CRLF) ConsoleWrite('- Func : $iTest2 = ' & $iTest2 & ' IsDeclared = ' & IsDeclared('iTest2') & @CRLF) EndFunc ; > Global: $iTest1 = 1 IsDeclared = 1 ; ! Func : $iTest1 = 2 IsDeclared = 1 ; - Func : $iTest2 = 3 IsDeclared = -1
-
Es ist aber kein guter Programmierstil, Global/Local innerhalb von Schleifen zu deklarieren.
Und was ist mit Dim[, Const, Static]?
-
ANSI? ==>> UTF-8!
-
Habe obiges Bsp. etwas erweitert, damit du auch die Ausgabe eines Fehlers sehen kannst.
-
Schaust du hier: Run , @ComSpec
1. Parameter
@ComSpec wird im Normalfall zu "C:\Windows\System32\cmd.exe" (64bit) oder "C:\Windows\SysWOW64\cmd.exe" (32bit) aufgelöst. Damit stellst du sicher, dass der im System voreingestellte Interpreter aufgerufen wird. Man kann natürlich auch einfach "cmd.exe" schreiben... aber mit dem Marko ist es sicherer. @ComSpec (cmd.exe) wird benötigt, wenn CMD-interne Befehle (z.B. echo) oder eine Batch-Datei ausgeführt werden soll, oder wenn eine Pipe (z.B. dir c:|clip) oder Umleitung (z.B. dir c: >m:\c-dir.txt) benötigt wird. Um z.B. einfach nur den Windows-Explorer zu starten, reicht ein Run("explorer.exe")
/c
gibt an, dass die CMD.exe nach Ausführung des Befehls beendet werden soll. Mit /k würde das CMD-Fenster offen bleiben.
'commandName'
ist ja eigentlich selbsterklärend... ist der Befehl, der in der CMD ausgeführt werden soll... das könnte z.B. 'dir c:' sein.
2. Parameter
""
Hier kannst du das Arbeisverzeichnis angeben. Das wirkt dann wie ein CD "Balbla...".
3. Parameter
@SW_HIDE (CMD-Fenster wird nicht angezeigt) oder @SW_SHOW (CMD-Fenster wird angezeigt)... es gibt noch andere Werte für @SW_* -ist aber hier nicht relevant.
4. Parameter
opt_flag
BitOR($STDERR_CHILD, $STDOUT_CHILD)
Stellt ein Handle zum *-Stream des Child-Fensters bereit. Hier in unserem Fall also für StderrRead und StdoutRead. Dadurch kannst du dann die Ausgaben des Progamms im CMD-Fenster auslesen.
Anstelle von BitOR könnte man hier auch einfach ein + nehmen... mit BitOR ist aber sicherer.
Relevante Themen: ConsoleRead, ProcessClose, RunAs, RunAsWait, RunWait, ShellExecute, ShellExecuteWait, StderrRead, StdinWrite, StdioClose, StdoutRead
Die Konstanten $STDERR_CHILD, $STDOUT_CHILD sind in AutoItConstants.au3 definiert.
Hier ein Bsp.:
AutoIt
Alles anzeigen#include <AutoItConstants.au3> #include <MsgBoxConstants.au3> _Example('c:') ; Ausgabe des Inhalts von c: - keine Fehlerausgabe. _Example('ä:') ; Ausgabe des Inhalts von WorkingDir, oder falls nicht angegeben (""), des Inhalts, in dem sich das AutoIt-Script befindet (@ScriptDir) - und Ausgabe des Fehlers, der aufgetreten ist - weil Drive "ä:" gibt es ja nicht. Exit Func _Example($sDrive) ; z.B. c: ;~ Local $sOutput, $iPID = Run(@ComSpec & " /c " & 'dir c:', "", @SW_HIDE, BitOR($STDERR_CHILD, $STDOUT_CHILD)) Local $sOutput, $iPID = Run(@ComSpec & " /c " & 'dir ' & $sPath, "", @SW_HIDE, BitOR($STDERR_CHILD, $STDOUT_CHILD)) If Not $iPID Then Exit 1 ; Es ist ein Fehler aufgetreten. ProcessWaitClose($iPID) ; Warten, bis CMD.exe beendet wurde. $sOutput = StdoutRead($iPID) MsgBox($MB_SYSTEMMODAL, "Stdout Read:", $sOutput) ; Die Ausgabe des dir-Befehls. $sOutput = StderrRead($iPID) MsgBox($MB_SYSTEMMODAL, "Stderr Read:", $sOutput) ; Ist hier leer, weil kein Fehler aufgetreten ist. EndFunc
-
@ComSpec
Wert von %comspec%, dem SPECifizierten zweiten COMmando Interpreter; primär für die Befehlszeilennutzung, z.B. Run(@ComSpec & " /k help | more").
Richtig ist:
Wert von %comspec%, dem SPECifizierten sekundären COMmand-Interpreter; primär für Befehlszeilenanwendungen, z.B. Run(@ComSpec & " /k help | more")
Im Original:
Value of %COMSPEC%, the SPECified secondary COMmand interpreter;
primary for command line uses, e.g. Run(@ComSpec & " /k help | more")
-
Aber eigentlich könnte man doch nur noch als 64bit kompilieren oder?
Nein, denn die mit SciTE4AutoIt3 mitgelieferten Tools funktionieren größtenteils leider nicht mit 64bit. Zudem bringt 64bit auch nur selten einen echten Vorteil... ergo nutze ich 64bit nur dann, wenn dem so ist, oder etwas mit 32bit nicht funktioniert. Manchmal ist es auch sinnvoll, beides zu kompilieren... damit das Script (die Exe) mit anderen Programmen arbeiten kann, die ebenfalls in 32bit und 64bit verfügbar sind - z.B. Total Commander.
-
Kann ich mit "@error" oder einem anderen Befehl den in der Batch enstandenen Fehler "feststellen" und im Falle eines Fehlers in AutoIt implementieren?
Ja, das kannst du, dazu musst du dem Befehl Run('CMD.exe') ein paar mehr Parametern mitgeben.
Run(@ComSpec & " /c " & 'commandName', "", @SW_HIDE, BitOR($STDERR_CHILD, $STDOUT_CHILD))
Schau dir dazu auch mal die Funktion StderrRead an...
Ja, und herzlich Willkommen hier im Forum!
PS: Setze deine Scripte demnächst bitte in Code-Tags, damit man sie besser lesen kann. Das ist im Forumseditor das dritte Symbol von rechts: </> - wenn du anschließend auf Quellcode klickst, kannst du die Syntax-Hervorhebung noch auf AutoIt umstellen, weil die Automatische Erkennung anscheinend nicht funktioniert. -- Ich war mal so frei und habe deinen ersten Beitrag in Code-Tags gesetzt.
-
Gepostet um 02:38 Uhr ! Einer der wenigen Vorteile bei uns alten Säcken ist zumindest, dass wir weniger Schlaf brauchen
Falsch, weil momentan bin ich krankgeschrieben und kann mir somit die Zeiten, wann "Tag" für mich ist, nach Belieben einteilen.
PS: Mein Chef hat mir deswegen gekündigt... aber egal, denn drei Minuten nach Kenntnisnahme der Kündigung hatte ich bereits eine verbindliche Zusage für eine neue (und bessere) Arbeitsstelle... ob das ein neuer Rekord ist?
Testen kann ich das Skript leider nicht, da ich nur mit einem, wenn auch sehr guten Monitor arbeite.
Ebenfalls falsch... kannst du wohl... halt nur nicht, ob es auf einem zweiten Monitor funktioniert.
Ein paar Dinge werde ich in dem "Tool" aber noch einbauen... vor allem, dass man mit einem Hotkey direkt in den Snipping-Modus kommt, und das man das Capture dann nicht nur als *.png speichern kann.
-
Hier ein Script von Melba23 aus dem EN-Forum (minimal geändert) :
Ich war mal so frei und habe da an einigen Stellen noch was geändert, weil es auf Systemen mit mehreren Monitoren nicht funktionierte!
PS: WinSetTrans($hCross_GUI, "", habe ich auf 120 gesetzt und die Farbe des Rectangle von schwarz auf rot geändert.
Schaut es euch an...
AutoIt: _Mark_Rect.au3
Alles anzeigen#cs ---------------------------------------------------------------------------- Author : Melba23 https://www.autoitscript.com/forum/topic/165325-how-to-get-4-screen-coordinates-just-by-dragging-a-rectangle/#elControls_1206830_menu Modified by...: Musashi, Bitnugger #ce ---------------------------------------------------------------------------- #include <AutoItConstants.au3> #include <GuiConstantsEx.au3> #include <WindowsConstants.au3> #include <Array.au3> #include <Misc.au3> ;~ #include <ScreenCapture.au3> #include <WinAPISys.au3> #include <WinAPISysWin.au3> Global $g_hUserDLL = DllOpen("user32.dll") HotKeySet("{ESC}", "_Terminate") Global $g_hMain_GUI, $idRect_Button, $idCancel_Button Global $g_tPOINT = DllStructCreate($tagPOINT) Global $g_hRectangle_GUI, $g_iX1, $g_iY1, $g_iX2, $g_iY2 _Main() Func _Main() Local $aMouse_Pos = MouseGetPos(), $aPos ;~ DllStructSetData($g_tPOINT, 'X', $aMouse_Pos[0]) ;~ DllStructSetData($g_tPOINT, 'Y', $aMouse_Pos[1]) $g_tPOINT.X = $aMouse_Pos[0] $g_tPOINT.Y = $aMouse_Pos[1] Local $hParent = _WinAPI_GetAncestor(_WinAPI_WindowFromPoint($g_tPOINT), $GA_ROOT) $aPos = WinGetPos($hParent) ; Create GUI $g_hMain_GUI = GUICreate("Select Rectangle", 240, 50, ($aPos[2] / 2) - 120, ($aPos[3] / 2) - 25) $idRect_Button = GUICtrlCreateButton("Mark Area", 10, 10, 80, 30) $idCancel_Button = GUICtrlCreateButton("Cancel", 150, 10, 80, 30) GUISetState() While 1 Switch GUIGetMsg() Case $GUI_EVENT_CLOSE, $idCancel_Button ;~ FileDelete(@ScriptDir & "Rect.bmp") Exit Case $idRect_Button GUISetState(@SW_HIDE, $g_hMain_GUI) _Mark_Rect() ; Capture selected area (#include <ScreenCapture.au3>) MsgBox($MB_SYSTEMMODAL, "Coords", "Left: " & $g_iX1 & @CRLF & "Top: " & $g_iY1 & @CRLF & "Right: " & $g_iX2 & @CRLF & "Bottom: " & $g_iY2, 5) GUISetState(@SW_SHOW, $g_hMain_GUI) ;~ WinActivate($g_hMain_GUI) ; Hm, bin sprachlos... funktioniert bei mir nicht - das Fenster kommt nicht nach vorne! _WinAPI_SetWindowPos($g_hMain_GUI, $HWND_TOP, 0, 0, 0, 0, BitOR($SWP_NOMOVE, $SWP_NOSIZE, $SWP_SHOWWINDOW)) ; Das aber... EndSwitch WEnd EndFunc ;==>_Main Func _Mark_Rect() Local $aMouse_Pos[2], $aOldMouse_Pos[2], $aPos[4], $hMaster_Rgn, $hRgn, $iRgnType, $iTemp #Region Create GUIs for Cross cursor and Rectangle ; Create transparent GUI with Cross cursor Local $w = _WinAPI_GetSystemMetrics($SM_CXVIRTUALSCREEN), $h = _WinAPI_GetSystemMetrics($SM_CYVIRTUALSCREEN) ; 3840, 1080 [Monitor 1|Monitor 2] Local $x = _WinAPI_GetSystemMetrics($SM_XVIRTUALSCREEN), $y = _WinAPI_GetSystemMetrics($SM_YVIRTUALSCREEN) ; -1920, 0 [Monitor 1|Monitor 2] ConsoleWrite(StringFormat('> $w = %5i, $h = %5i, $x = %5i, $y = %5i\n', $w, $h, $x, $y)) ;~ $hCross_GUI = GUICreate("Test", @DesktopWidth, @DesktopHeight - 20, 0, 0, $WS_POPUP, $WS_EX_TOPMOST) $hCross_GUI = GUICreate("Test", $w, $h, $x, $y, $WS_POPUP, $WS_EX_TOPMOST) ; $w = 3840, $h = 1060, $x = -1920, $y = 0 $aPos = WinGetPos($hCross_GUI) ConsoleWrite('> GUI_Pos for Cross cursor and Rectangle: $aPos = ' & _ArrayToString($aPos, ', ') & @CRLF & @CRLF) ;~ WinSetTrans($hCross_GUI, "", 8) WinSetTrans($hCross_GUI, "", 120) GUISetState(@SW_SHOW, $hCross_GUI) GUISetCursor($IDC_CROSS, $GUI_CURSOR_OVERRIDE, $hCross_GUI) ;~ $g_hRectangle_GUI = GUICreate("", @DesktopWidth, @DesktopHeight, 0, 0, $WS_POPUP, $WS_EX_TOOLWINDOW + $WS_EX_TOPMOST) $g_hRectangle_GUI = GUICreate("", $w, $h, $x, $y, $WS_POPUP, $WS_EX_TOOLWINDOW + $WS_EX_TOPMOST) ;~ GUISetBkColor(0x000000) ; schwarzes Rectangle GUISetBkColor(0xFF0000) ; rotes Rectangle #EndRegion Create GUIs for Cross cursor and Rectangle #Region Wait until mouse button pressed While Not _IsPressed("01", $g_hUserDLL) Sleep(10) WEnd Local $iOldMouseCoordMode = Opt('MouseCoordMode', 0) ; get relative coords to the active window!!! ; Get first mouse position $aMouse_Pos = MouseGetPos() $g_iX1 = $aMouse_Pos[0] $g_iY1 = $aMouse_Pos[1] ConsoleWrite('> $aMouse_Pos #1 = ' & _ArrayToString($aMouse_Pos, ', ') & @CRLF) Local Static $aRgnType = ['$ERRORREGION', '$NULLREGION', '$SIMPLEREGION', '$COMPLEXREGION'] $aPos = WinGetPos($g_hRectangle_GUI) ConsoleWrite('> $g_hRectangle_GUI: $aPos = ' & _ArrayToString($aPos, ', ') & @CRLF & @CRLF) Local $left, $top, $right, $bottom $left = $g_iX1 + $aPos[0] $top = $g_iY1 + $aPos[0] #EndRegion Wait until mouse button pressed #Region Draw rectangle while mouse button pressed While _IsPressed("01", $g_hUserDLL) While 1 $aMouse_Pos = MouseGetPos() If ($aMouse_Pos[0] & $aMouse_Pos[1]) <> ($aOldMouse_Pos[0] & $aOldMouse_Pos[1]) Then $aOldMouse_Pos = $aMouse_Pos ExitLoop EndIf If Not _IsPressed("01", $g_hUserDLL) Then ExitLoop Sleep(10) WEnd ToolTip('$aMouse_Pos = ' & $aMouse_Pos[0] & ', ' & $aMouse_Pos[1] & @LF & '$g_iX1 = ' & $g_iX1 & ' $g_iY1 = ' & $g_iY1) $hMaster_Rgn = _WinAPI_CreateRectRgn(0, 0, 0, 0) $hRgn = _WinAPI_CreateRectRgn($g_iX1, $g_iY1, $g_iX1 + 1, $aMouse_Pos[1]) ; Left of rectangle If Not $hRgn Then Exit 2 $iRgnType = _WinAPI_CombineRgn($hMaster_Rgn, $hRgn, $hMaster_Rgn, $RGN_OR) ConsoleWrite("> var: $iRgnType --> " & $aRgnType[$iRgnType] & @LF) _WinAPI_DeleteObject($hRgn) $hRgn = _WinAPI_CreateRectRgn($g_iX1 + 1, $g_iY1 + 1, $aMouse_Pos[0], $g_iY1) ; Top of rectangle If Not $hRgn Then Exit 3 $iRgnType = _WinAPI_CombineRgn($hMaster_Rgn, $hRgn, $hMaster_Rgn, $RGN_OR) ConsoleWrite("+ var: $iRgnType --> " & $aRgnType[$iRgnType] & @LF) _WinAPI_DeleteObject($hRgn) $hRgn = _WinAPI_CreateRectRgn($aMouse_Pos[0], $g_iY1, $aMouse_Pos[0] + 1, $aMouse_Pos[1]) ; Right of rectangle If Not $hRgn Then Exit 4 $iRgnType = _WinAPI_CombineRgn($hMaster_Rgn, $hRgn, $hMaster_Rgn, $RGN_OR) ConsoleWrite("- var: $iRgnType --> " & $aRgnType[$iRgnType] & @LF) _WinAPI_DeleteObject($hRgn) $hRgn = _WinAPI_CreateRectRgn($g_iX1, $aMouse_Pos[1], $aMouse_Pos[0], $aMouse_Pos[1] + 1) ; Bottom of rectangle If Not $hRgn Then Exit 1 $iRgnType = _WinAPI_CombineRgn($hMaster_Rgn, $hRgn, $hMaster_Rgn, $RGN_OR) ConsoleWrite("! var: $iRgnType --> " & $aRgnType[$iRgnType] & @LF) _WinAPI_DeleteObject($hRgn) ; Set overall region If Not _WinAPI_SetWindowRgn($g_hRectangle_GUI, $hMaster_Rgn) Then Exit 5 If WinGetState($g_hRectangle_GUI) < 15 Then GUISetState() Sleep(10) WEnd #EndRegion Draw rectangle while mouse button pressed ToolTip('') ; Get second mouse position $g_iX2 = $aMouse_Pos[0] $g_iY2 = $aMouse_Pos[1] ConsoleWrite('> $aMouse_Pos #2 = ' & _ArrayToString($aMouse_Pos, ', ') & @CRLF) ; Set in correct order if required ;~ If $g_iX2 < $g_iX1 Then ;~ $iTemp = $g_iX1 ;~ $g_iX1 = $g_iX2 ;~ $g_iX2 = $iTemp ;~ EndIf ;~ If $g_iY2 < $g_iY1 Then ;~ $iTemp = $g_iY1 ;~ $g_iY1 = $g_iY2 ;~ $g_iY2 = $iTemp ;~ EndIf _SwitchRect($g_iX1, $g_iX2) _SwitchRect($g_iY1, $g_iY2) GUIDelete($g_hRectangle_GUI) GUIDelete($hCross_GUI) Opt('MouseCoordMode', $iOldMouseCoordMode) ConsoleWrite('Exit _Mark_Rect' & @CRLF) EndFunc ;==>_Mark_Rect Func _SwitchRect(ByRef $i1, ByRef $i2) Local $iTemp If $i2 < $i1 Then $iTemp = $i1 $i1 = $i2 $i2 = $iTemp EndIf EndFunc ;==>_SwitchRect ; ------------------------------------------- Func _Terminate() DllClose($g_hUserDLL) Exit ; EndFunc ;==>_Terminate
-
Solltest Du ein bestimmtes Problem lösen wollen und das nicht zwingend mit AutoIT, könntest Du das vielleicht auch mit verfügbarer Software machen.
Richtig, das ist so gut wie immer machbar, doch wenn ein User nicht selbst darauf kommt, hat er ein dringenderes Problem, das sich mit Software nicht lösen lässt... von daher ist dieser Hinweis für meine Begriffe eher überflüssig.
Mach von beiden Verzeichnissen mit der Shell jeweils eine Textdatei und vergleiche die mit Notepad++ mit dem Plugin "Compare".
Das ist so ziemlich sicher einer der umständlichsten Wege, um sein Problem zu lösen... denn der größte Teil an Arbeit bleibt so ja trotzdem bei ihm hängen. Da du hier die Shell erwähnst... ja, damit ginge das auch relativ einfach... also via Batch mit CMD oder Powershell - die ihm dann die ganze Arbeit abnehmen. Doch irgendwer muss das Batch ja dann auch schreiben... und da muss man schon richtig fit für sein, um dies hinzubekommen.
Mit AutoIt bekomme ich das in ~ 15-30 Minuten hin... für ein Batch mit CMD oder Powershell wäre mein Tag vermutlich versaut.
Vermutlich gibt es auch noch diverse andere Hilfsmittel in der weiten Welt des Netzes.
In der Tat... die gibt es... z.B. Total Commander... der hat eine super Funktion dafür eingebaut, mit der Verzeichnisinhalte synchronisiert werden können - ein sehr mächtiges Werkzeug, dass keine Wünsche offen lässt.
-
Ich bin leider auch einer der sehr gerne IF/THEN/ELSE verwendet obwohl es doch viel einfach oder kürzer geht!
Ja... mal schauen, in 1-3 Jahren siehst du das sicher anders!
Hier noch ein Bsp., um es dir schmackhaft zu machen :
AutoIt
Alles anzeigenLocal $aFileArray1[10], $aFileArray2[9], $iLength ; Select largest array - If...ElseIf...Else...EndIf ; ------------------------------------------------- ; So etwa habe ich es heute im blauen Forum gesehen. If UBound($aFileArray1) > UBound($aFileArray2) Then $iLength = UBound($aFileArray1) ElseIf UBound($aFileArray1) < UBound($aFileArray2) Then $iLength = UBound($aFileArray2) Else ; Arrays must be same size $iLength = UBound($aFileArray1) EndIf ConsoleWrite('$iLength = ' & $iLength & @CRLF) ; --------------------- insgesamt 307 Zeichen ; Aua... so macht man das: Local $ub1 = UBound($aFileArray1), $ub2 = UBound($aFileArray2) If $ub1 > $ub2 Then $iLength = $ub1 ElseIf $ub1 < $ub2 Then $iLength = $ub2 Else ; Arrays must be same size $iLength = $ub1 EndIf ConsoleWrite('$iLength = ' & $iLength & @CRLF) ; --------------------- insgesamt 250 Zeichen ; Select largest array - Ternary Operator ; ------------------------------------------------- Local $ub1 = UBound($aFileArray1), $ub2 = UBound($aFileArray2) $iLength = ($ub1 > $ub2) ? ($ub1) : ($ub1 < $ub2) ? ($ub2) : ($ub1) ConsoleWrite('$iLength = ' & $iLength & @CRLF) ; --------------------- insgesamt 179 Zeichen ; Ohne () geht auch, kann aber in die Hose gehen... doch hier würde ich es ohne machen. Local $ub1 = UBound($aFileArray1), $ub2 = UBound($aFileArray2) $iLength = $ub1 > $ub2 ? $ub1 : $ub1 < $ub2 ? $ub2 : $ub1 ConsoleWrite('$iLength = ' & $iLength & @CRLF) ; -------------------- insgesamt 169 Zeichen
-
Könntest Du Deine Lösung ggf. auch im englischen Thread posten ?
Das ist ja keine Lösung, sondern lediglich eine kleine Demo.
Wenn ich das mache, dann bekomme ich am Ende noch (völlig unverdient) die Credits .
Sei dir gegönnt... also mach dich ran...
-
Bitte, kannst Du mir das erklären?
? ist der Ternary Operator - eine Kurzform für If...Else...EndIf.