ShellExecute($DConnect,"-startda","","open",@SW_SHOWMINIMIZED)
Mit Run funktioniert es nicht.
ShellExecute($DConnect,"-startda","","open",@SW_SHOWMINIMIZED)
Mit Run funktioniert es nicht.
Dann würde ich in der Hilfe zumimdest einen Hinweis darauf erwarten, dass weitere flags möglich sind.
Und in der Beschreibung der Makros sollte entweder ein bestehender Unterschied besser beschrieben oder darauf hingewiesen werden, dass z.B. @SW_Maximize und @SW_ShowMaximized den selben Effekt haben.
Oder bin ich da zu pingelig
Interessant. In der Hilfe steht aber nix von @SW_SHOWMINIMIZED. Sollten wir die Hilfe aktualisieren?
Hehe... ne, wie ich soeben getestet habe, ist es eh egal, was ich bei Run angebe, es wird ignoriert.
https://docs.microsoft.com/en-us/windows/…user-showwindow
Das hier habe ich als Show.exe kompiliert:
GUICreate('Test_SW')
GUISetState() ; @SW_SHOW = Shows a previously hidden window (default)
Do
Sleep(100)
Until GUIGetMsg() = -3
Und hiermit habe ich die Show.exe gestartet:
Run('m:\AutoIt\Test\Show.exe', '', @SW_HIDE) ; @SW_MINIMIZE, @SW_HIDE bringt nicht, es ist egal was man da setzt!
WinSetState(WinWait('Test_SW', '', 5),'', @SW_MINIMIZE) ; das funktioniert!
;~ WinSetState(WinWait('Test_SW', '', 5),'', 11) ; funktioniert auch! - @SW_FORCEMINIMIZE = 11 (kennt AutoIt nicht!)
Es geht also doch nicht ohne ein WinSetState... ergo falsch gedacht und du hattest recht.
Hab noch mal etwas rumgespielt.
Die Flags von Run funktionieren nur für Programme die als CUI compiliert sind. (#AutoIt3Wrapper_Change2CUI=Y).
Sieht so aus, als ob die Flags für DOS-Fenster gelten, das von Run angezeigt wird.
Ich verfolge dieses Thema nicht detailliert.
Wenn ich was ergänzen soll, schreibt mir was und wo, dann nehme ich es auf
[...] es ist eh egal, was ich bei Run angebe, es wird ignoriert.
Ja, selbst eine Show.exe, die nur aus MsgBox(0, "Test", "3 Sekungen warten", 3) besteht, ignoriert z.B. Run(..., @SW_HIDE).
Sieht so aus, als ob die Flags für DOS-Fenster gelten, das von Run angezeigt wird.
Ob das nur für "DOS-Fenster" gilt, bin ich mir nicht ganz sicher.
Beispiel :
Die angehängte ZIP in ein Testverzeichnis kopieren und entpacken.
Zusätzlich eine Datei dort 'reinkopieren, die ca. 100 MB groß ist (damit man auch etwas sieht).
Sowohl die 7zG.exe = standalone 7Zip-Modul mit GUI als auch die 7za.exe = standalone 7Zip-Modul ohne GUI reagieren auf die @SW_*-Flags. Einfach etwas herumspielen.
Liegt möglicherweise aber an der Programmierung der 7zG.exe .
Gruß Musashi
Sowohl die 7zG.exe = standalone 7Zip-Modul mit GUI als auch die 7za.exe = standalone 7Zip-Modul ohne GUI reagieren auf die @SW_*-Flags.
Ja, ok, das sind aber auch beides Spezialfälle...
7zG.exe: #32770 The class for a dialog box.
7za.exe: ConsoleWindowClass
Hallo ihr Experten,
hab mich mal ein bisschen mit Array beschäftigt.
Komme aber nicht ganz Klar:
XML String:
<countryCode>DE</countryCode>
<country>Deutschland</country>
<countryCodeISO3>DEU</countryCodeISO3>
<freeformAddress>Musterstraße 4, 01234 Muster</freeformAddress>
<localName>Musterhausen</localName>
</address>
<position>
<lat>49.90707</lat>
<lon>7.81838</lon>
</position>
<viewport>
<topLeftPoint>
Hier möchte ich den Wert lat und lon in Variable speichern.
Mein Script:
$temp = StringSplit($strXML,@CRLF) ; wandelt quellcode String in Array
_ArrayDisplay($temp) ; kompletter Quellcode
$startpos = _ArraySearch($temp,"<position>",0,0,0,1) ; hier gehts los
$endpos = _ArraySearch($temp, '<viewport>',0,0,0,1) - 1 ; 1 Feld vor dem Treffer ist das letzte das uns interessiert
;MsgBox(0,"",$startpos & " bis " & $endpos)
For $i = $startpos to $endpos
;$curUrl= _StringBetween($temp[$i] ,'<lat>',"</lat") ; für jedes Array Feld des Bereiches der uns interessiert nehmen wir den Teil des Strings de wir suchen
$curUrl= _StringBetween($temp[$i] ,'<lon>',"</lon")
if $curUrl = 0 Then ; wenn die Suche fehlerhaft war machen wir mit dem nächsten Feld weiter
ContinueLoop
Else
_ArrayAdd($aLat,$curUrl[0]) ; suche war erfolgreich also speichern wir den Teilstring in unser Ergebnis Array
$aLat[0] += 1 ; kann man auch weglassen, erhöht den Zähler des 0ten Array eintrags um 1, damit man kein ubound benötigt um die Arraygröße zu ermitteln
EndIf
Next
_ArrayDisplay($aLat)
For $i = $startpos to $endpos
$curUrl= _StringBetween($temp[$i] ,'<lat>',"</lat") ; für jedes Array Feld des Bereiches der uns interessiert nehmen wir den Teil des Strings de wir suchen
$curUrl= _StringBetween($temp[$i] ,'<lon>',"</lon")
if $curUrl = 0 Then ; wenn die Suche fehlerhaft war machen wir mit dem nächsten Feld weiter
ContinueLoop
Else
_ArrayAdd($aLon,$curUrl[0]) ; suche war erfolgreich also speichern wir den Teilstring in unser Ergebnis Array
$aLon[0] += 1 ; kann man auch weglassen, erhöht den Zähler des 0ten Array eintrags um 1, damit man kein ubound benötigt um die Arraygröße zu ermitteln
EndIf
Next
_ArrayDisplay($aLon)
Ich bekomme entweder lat oder lon einzeln aber nicht beide auf einmal.
Könnt ihr mir bitte helfen.
Hab mir die englische Wiki übersetzt komme aber trotzdem nicht ganz klar.
Gruß Windi
Mein Script:
Hallo Windi ,
Tipp : Verwende zum posten (d)eines Skriptes das Code-Icon </> aus dem Beitragsheader :
Das Skript ist so auch nicht vollständig, da z.B. #include <Array.au3> fehlt.
Gruß Musashi
$curUrl= _StringBetween($temp[$i] ,'<lat>',"</lat") ; für jedes Array Feld des Bereiches der uns interessiert nehmen wir den Teil des Strings de wir suchen
$curUrl= _StringBetween($temp[$i] ,'<lon>',"</lon")
Du speicherst beide Ergebnisse in derselben Variable
Er zeigt mir aber trotzdem nur 1 Wert an.
#include <array.au3>
#include <String.au3>
#Include <INet.au3>
$temp = StringSplit($strXML,@CRLF) ; wandelt quellcode String in Array
;_ArrayDisplay($temp) ; kompletter Quellcode
Local $startpos = _ArraySearch($temp,"<position>",0,0,0,1) ; hier gehts los
Local $endpos = _ArraySearch($temp, '<viewport>',0,0,0,1) - 1 ; 1 Feld vor dem Treffer ist das letzte das uns interessiert
;MsgBox(0,"",$startpos & " bis " & $endpos)
For $i = $startpos to $endpos
$curUrl= _StringBetween($temp[$i] ,'<lat>',"</lat") ; für jedes Array Feld des Bereiches der uns interessiert nehmen wir den Teil des Strings de wir suchen
$curUrl= _StringBetween($temp[$i] ,'<lon>',"</lon")
if $curUrl = 0 Then ; wenn die Suche fehlerhaft war machen wir mit dem nächsten Feld weiter
ContinueLoop
Else
_ArrayAdd($aLat,$curUrl[0]) ; suche war erfolgreich also speichern wir den Teilstring in unser Ergebnis Array
$aLat[0] += 1 ; kann man auch weglassen, erhöht den Zähler des 0ten Array eintrags um 1, damit man kein ubound benötigt um die Arraygröße zu ermitteln
EndIf
Next
_ArrayDisplay($aLat)
Alles anzeigen
$curUrl= _StringBetween($temp[$i] ,'<lat>',"</lat") ; für jedes Array Feld des Bereiches der uns interessiert nehmen wir den Teil des Strings de wir suchen
$curUrl= _StringBetween($temp[$i] ,'<lon>',"</lon")
Du speicherst beide Ergebnisse immer noch in derselben Variable !
Könntest Du bitte mal eine XML-Datei posten, die mehrere Blöcke mit <lat>49.90707</lat> und <lon>7.81838</lon> enthält (sensible Daten ersetzen).
Gruß Musashi
Hier noch ein Bsp.:
#include <Array.au3>
Local $XMLString = _
'<countryCode>DE</countryCode>' & @CRLF & _
'<country>Deutschland</country>' & @CRLF & _
'<countryCodeISO3>DEU</countryCodeISO3>' & @CRLF & _
'<freeformAddress>Musterstraße 4, 01234 Muster</freeformAddress>' & @CRLF & _
'<localName>Musterhausen</localName>' & @CRLF & _
'</address>' & @CRLF & _
'<position>' & @CRLF & _
'<lat>49.90707</lat>' & @CRLF & _
'<lon>7.81838</lon>' & @CRLF & _
'</position>' & @CRLF & _
'<viewport>' & @CRLF & _
'<topLeftPoint>' & @CRLF & _
'<countryCode>DE</countryCode>' & @CRLF & _
'<country>Deutschland</country>' & @CRLF & _
'<countryCodeISO3>DEU</countryCodeISO3>' & @CRLF & _
'<freeformAddress>Musterstraße 5, 01234 Muster</freeformAddress>' & @CRLF & _
'<localName>Musterhausen</localName>' & @CRLF & _
'</address>' & @CRLF & _
'<position>' & @CRLF & _
'<lat>46.90707</lat>' & @CRLF & _
'<lon>6.81838</lon>' & @CRLF & _
'</position>' & @CRLF & _
'<viewport>' & @CRLF & _
'<topLeftPoint>' & @CRLF
Local $aLat = StringRegExp($XMLString, '<lat>(.+)</lat>', 3)
Local $aLon = StringRegExp($XMLString, '<lon>(.+)</lon>', 3)
_ArrayDisplay($aLat, '$aLat', '', 0, Default, 'Lat')
_ArrayDisplay($aLon, '$aLon', '', 0, Default, 'Lon')
Local $aLatLon[UBound($aLat)][2]
For $i = 0 To UBound($aLatLon) -1 Step 1
$aLatLon[$i][0] = $aLat[$i]
$aLatLon[$i][1] = $aLon[$i]
Next
_ArrayDisplay($aLatLon, '$aLatLon', '', 0, Default, 'Lat|Lon')
Alles anzeigen
Nicht meine erste Wahl, aber es folgt Deiner Skriptlogik :
EDIT : Bitnugger war Sekunden schneller und hat es so gelöst, wie auch ich es für sinnvoller halte.
#include <array.au3>
#include <String.au3>
#include <StringConstants.au3>
#include <INet.au3>
Global $strXML = "<countryCode>DE</countryCode>" & @CRLF & _
"<country>Deutschland</country>" & @CRLF & _
"<countryCodeISO3>DEU</countryCodeISO3>" & @CRLF & _
"<freeformAddress>Musterstraße 4, 01234 Muster</freeformAddress>" & @CRLF & _
"<localName>Musterhausen</localName>" & @CRLF & _
"</address>" & @CRLF & _
"<position>" & @CRLF & _
"<lat>49.90707</lat>" & @CRLF & _
"<lon>7.81838</lon>" & @CRLF & _
"</position>" & @CRLF & _
"<viewport>"
Global $aLat[0], $aLon[0], $iStartpos, $iEndpos, $aSource, $aCurUrl1, $aCurUrl1
$aSource = StringSplit($strXML, @CRLF, $STR_ENTIRESPLIT) ; wandelt quellcode String in Array
_ArrayDisplay($aSource) ; kompletter Quellcode
Local $iStartpos = _ArraySearch($aSource, "<position>", 0, 0, 0, 1) ; hier gehts los
Local $iEndpos = _ArraySearch($aSource, '<viewport>', 0, 0, 0, 1) - 1 ; 1 Feld vor dem Treffer ist das letzte das uns interessiert
ConsoleWrite($iStartpos & " bis " & $iEndpos & @CRLF)
For $i = $iStartpos To $iEndpos
$aCurUrl1 = _StringBetween($aSource[$i], '<lat>', "</lat") ; für jedes Array Feld des Bereiches der uns interessiert nehmen wir den Teil des Strings de wir suchen
If Not @error Then ; wenn die Suche fehlerhaft war machen wir mit dem nächsten Feld weiter
ConsoleWrite("> >>>" & $i & " : ArrayAdd LAT : " & $aCurUrl1[0] & @CRLF)
_ArrayAdd($aLat, $aCurUrl1[0]) ; suche war erfolgreich also speichern wir den Teilstring in unser Ergebnis Array
EndIf
$aCurUrl2 = _StringBetween($aSource[$i], '<lon>', "</lon")
If Not @error Then ; wenn die Suche fehlerhaft war machen wir mit dem nächsten Feld weiter
ConsoleWrite("> >>>" & $i & " : ArrayAdd LON : " & $aCurUrl2[0] & @CRLF)
_ArrayAdd($aLon, $aCurUrl2[0]) ; suche war erfolgreich also speichern wir den Teilstring in unser Ergebnis Array
EndIf
Next
_ArrayDisplay($aLat, "LAT")
_ArrayDisplay($aLon, "LON")
Alles anzeigen
Ich verstehe das nicht... habe mein obiges Bsp. etwas geändert, doch so werden mir im Array leere Zeilen (Chr(0) in Row 1 und Row 4) angezeigt. Wenn ich aber hier schaue, sollte das nicht der Fall sein.
#include <Array.au3>
Local $XMLString = _
'<countryCode>DE</countryCode>' & @CRLF & _
'<country>Deutschland</country>' & @CRLF & _
'<countryCodeISO3>DEU</countryCodeISO3>' & @CRLF & _
'<freeformAddress>Musterstraße 4, 01234 Muster</freeformAddress>' & @CRLF & _
'<localName>Musterhausen</localName>' & @CRLF & _
'</address>' & @CRLF & _
'<position>' & @CRLF & _
'<lat>49.90707</lat>' & @CRLF & _
'<lon>7.81838</lon>' & @CRLF & _
'</position>' & @CRLF & _
'<viewport>' & @CRLF & _
'<topLeftPoint>' & @CRLF & _
'<countryCode>DE</countryCode>' & @CRLF & _
'<country>Deutschland</country>' & @CRLF & _
'<countryCodeISO3>DEU</countryCodeISO3>' & @CRLF & _
'<freeformAddress>Musterstraße 5, 01234 Muster</freeformAddress>' & @CRLF & _
'<localName>Musterhausen</localName>' & @CRLF & _
'</address>' & @CRLF & _
'<position>' & @CRLF & _
'<lat>46.90707</lat>' & @CRLF & _
'<lon>6.81838</lon>' & @CRLF & _
'</position>' & @CRLF & _
'<viewport>' & @CRLF & _
'<topLeftPoint>' & @CRLF
;~ ClipPut($XMLString)
;~ https://regex101.com/r/Penq4V/1
Local $aLatLon = StringRegExp($XMLString, '<lat>(.+)<\/lat>|<lon>(.+)<\/lon>', 3)
For $i = 0 To UBound($aLatLon) -1 Step 1
ConsoleWrite($i & ' ' & Asc($aLatLon[$i]) & @CRLF)
Next
_ArrayDisplay($aLatLon, '$aLatLon', '', 0, Default, 'Lat|Lon')
Alles anzeigen
Ich habe folgendes geändert von Bitnugger dann läuft es.
Braucht man das?
Ich habe folgendes geändert von Bitnugger dann läuft es.
Das war nicht von mir, sondern von Musashi.
Das $STR_ENTIRESPLIT sorgt dafür, dass die @CRLF, die ja aus zwei Zeichen bestehen, wie eines behandelt wird. Lässt du das $STR_ENTIRESPLIT weg, wird bei @CR und bei @LF gesplittet. Da es bei dir nicht funktioniert, kann es gut sein, dass du in der Variable $strXML gemischte Zeilenumbrüche hast... also mal @CRLF, mal nur @LF oder @CR... denn bei mir funktioniert das Script von ihm.
Ok, hab's gesehen. Das alter lässt Grüßen.
Trotzdem Danke euch beiden, wieder ein Stück weiter.
Gruß Windi
Wie Bitnugger bereits erklärt hat sorgt $STR_ENTIRESPLIT dafür, dass @CRLF wie ein Zeichen behandelt wird. Lässt du das $STR_ENTIRESPLIT weg, wird bei @CR und bei @LF gesplittet. Da Du, wie er sicher richtig vermutet, in der Variable $strXML gemischte Zeilenumbrüche hast, kannst Du diese wie folgt einheitlich mit @CRLF ersetzen :
...
$strXML = StringRegExpReplace($strXML, "(?m)(\R)+", @CRLF)
$aSource = StringSplit($strXML, @CRLF, $STR_ENTIRESPLIT) ; wandelt quellcode String in Array
...
Gruß Musashi