1. Dashboard
  2. Mitglieder
    1. Letzte Aktivitäten
    2. Benutzer online
    3. Team
    4. Mitgliedersuche
  3. Forenregeln
  4. Forum
    1. Unerledigte Themen
  • Anmelden
  • Registrieren
  • Suche
Alles
  • Alles
  • Artikel
  • Seiten
  • Forum
  • Erweiterte Suche
  1. AutoIt.de - Das deutschsprachige Forum.
  2. Mitglieder
  3. BLinz

Beiträge von BLinz

  • Frage zu include bei nicht kompilierung

    • BLinz
    • 10. Mai 2017 um 21:12

    Ich vermute mal, da er das als Logon-Script nutzen will - soll es für alle / viele Benutzer ausgeführt werden.

    Dann müsste auf allen Rechnern der Benutzer auch Autoit installiert sein - sonst weiß deren rechner nicht was eine .au3 Datei ist.
    Bei Kixtart hat man die Runtime einfach dazu kopiert.

    Komplizierte Lösung: Du kopierst die AutoIt-Runtime und alle Include-Skripte auch nach Netlogon, die Includes stellst du alle um auf ""
    Der Aufruf für die Benutzer muss ähnlich wie bei Kixtart mit "autoit3.exe deinskript.au3" erfolgen, ggf. mit Pfaden

    Einfache Lösung: Du kompilierst das Skript einfach (machst eine .exe daraus). Das Ding ist dann komplett allein für sich lauffähig ohne irgendwelche Voraussetzungen auf den Clients.
    Den Quellcode kannst du ja auch im Netlogon ablegen - und lässt die .exe auch nach dorthin erzeugen. So kannst du von deinem Admin-PC es schnell ändern.

  • Brauche Ideen für Zeitmessung zwischen 2 Rechnern

    • BLinz
    • 10. Mai 2017 um 20:58

    Hallo in die Runde,

    ich stehe gerade mal voll auf dem Schlauch und bräuchte eine Idee für die folgende Problemstellung:

    Ausgangslage:

    • Client auf Rechner A
    • Server auf Rechner B
    • zwischen beiden findet per TCP ein Datenaustausch statt (ich sende JSONs vom Client zum Server)

    Problemstellungen:

    • Den Unterschied zwischen der jeweils lokalen Systemzeit feststellen.
      Im Moment sende ich vom Client die Ausgabe von _NowCalc(), führe am Server ebenfalls ein _NowCalc() aus und berechne die Differenz mit _DateDiff
      Das ergibt einen Sekunden genauen Wert.
      Wie könnte ich das auf Millisekunden genau ermitteln? Klar, es wird einen Fehler/Abweichung durch die Laufzeit der TCP-Pakete geben - dazu Punkt 2
    • Wie Messe ich die Laufzeit meiner Datenpakete zwischen Client und Server? Würde ich mir z.B. errechnen wenn ich die Differenz aus 1. kenne
    • Alternativ: Wie schaffe ich es 2 Funktionen / Befehle auf diesen beiden Rechnern exakt zum gleichen Zeitpunkt zu starten?

    Hintergundgeschichte:

    Ich baue hier gerade ein "App-Performance-Monitoring" einer Applikation innerhalb einer RDP und/oder Citrix-Sitzung.
    Der Server startet auf einem Test-Client die Citrix-Sitzung. In dieser wird der Client gestartet.
    Dieser nimmt Verbindung zum Server-teil auf - das ist für mich die gemessene Anmeldezeit / Startzeit für die Sitzung.
    Der Client startet dann das Programm des Kunden und führt verschiedene Aktionen durch. Die Laufzeiten ermittelt der Client "lokal".
    Nun gibt es einen Zeitunterschied zwischen dem "Fertig" sein und bis man es über die Citrix-Verbindung sieht. Im lokalen Netzwerk nur ein paar duzend Millisekunden - aus den USA ggf. ein paar hundert.
    Die "Fertig" Ermittlung mit dem Server-Teil (also über die Citrix-Sitzung) habe ich schon fertig (Optisch über die Farbänderungen der Pixel).
    Damit ich diesen Zeitunterschied in Zahlen fassen kann müsste ich entweder den Zeitunterschied kennen - oder unabhängig von der lokalen zeit es schaffen auf beiden Rechnern einen Vorgang zu exakt gleichen Zeit zu starten.

    Gruß,

    BLinzer

  • MFCReportCtrl - Eintrag auslesen oder ähnliches

    • BLinz
    • 3. Mai 2017 um 16:45

    Moin,

    ich baue hier gerade an einem Applikationstest herum. Dabei starte ich ein Programm und rufe verschiedene Funktionen in diesem auf - das klappt auch, das ist ja eigentlich die Paradedisziplin von AutoIt.
    Als Prüfung rufe ich verschiedene Datensätze auf und bekomme entsprechende Rückgaben.
    Um die Controls für die GUI des Programmes zu ermitteln nutze ich das Au3Info.exe Programm

    Nun habe ich - neben 6 x Class "SysTreeView32" auch ein Control von folgendem Typ:

    MFCReportCtrl

    Ich kann mit ControlGetHandle mit einen Zeiger darauf holen - und das war es dann auch schon.
    Bei Tante Google gibt es genau einen Treffer zu dem Thema: https://www.autoitscript.com/forum/topic/63…trl-automation/
    Ich habe jetzt mit allem möglichen schon dran rumprobiert - aber ohne Erfolg.

    Ich müsste zumindest den ersten Eintrag auslesen ...

    Danke!

  • #RequireAdmin, script wird nicht ausgeführt

    • BLinz
    • 3. Mai 2017 um 16:32

    Du startest also von einem Programm welches mit niedrigen Rechten ausgeführt wird ein Programm welches höhere Rechte benötigt.
    Das geht so nicht (wie du festgestellt hast).
    Ggf. geht es mit RunAs bzw RunAsWait wobei du dann einen Benutzer angeben müsstest.

    Ansonsten muss dein Hauptprogramm gleich mit Adminrechten starten. Beim Nachstarten geht halt keine UAC Warnung auf.
    Alternative: Als Benutzer Administrator arbeiten, der geht immer/meist am UAC vorbei ...

    Auf was steht denn deine UAC-Kontrolle?

  • Powershell auslesen

    • BLinz
    • 10. Februar 2016 um 17:47
    Zitat von bernd670

    Hallo,

    das geht mit StdinWrite und dem Parameter $STDIN_CHILD.
    Damit Powershell die Befehl von der Standardeingabe liest muss Powershell mit -Command - aufgerufen werden. Wichtig ist das Minus hinter -Command!!!


    Danke! Ich habe 2h Stunden probiert und getestet bis ich den Beitrag gefunden habe - das war der entscheidende Hinweis!
    Projekt gerettet!

  • WMI Abfrage - Ich kann den Typ nicht bestimmen

    • BLinz
    • 12. November 2015 um 12:06

    Argghh ich hab die Lösung dann doch gefunden .... es war einfach zu ... einfach ...

    Ich musste kein weiteres "For ... In" nutzen sondern einfach an das "Attributes" die weiteren Strukturnamen anhängen:

    AutoIt
    $a_MSFC_FibrePortHBAAttributes[ $a_MSFC_FibrePortHBAAttributes[0][0] ][3] = $o_FCPort.Attributes.NumberofDiscoveredPorts 
    $a_MSFC_FibrePortHBAAttributes[ $a_MSFC_FibrePortHBAAttributes[0][0] ][5] = $o_FCPort.Attributes.PortFcId
    $a_MSFC_FibrePortHBAAttributes[ $a_MSFC_FibrePortHBAAttributes[0][0] ][6] = $o_FCPort.Attributes.PortMaxFrameSize
    $a_MSFC_FibrePortHBAAttributes[ $a_MSFC_FibrePortHBAAttributes[0][0] ][7] = $o_FCPort.Attributes.PortSpeed
    $a_MSFC_FibrePortHBAAttributes[ $a_MSFC_FibrePortHBAAttributes[0][0] ][8] = $o_FCPort.Attributes.PortState
    $a_MSFC_FibrePortHBAAttributes[ $a_MSFC_FibrePortHBAAttributes[0][0] ][9] = $o_FCPort.Attributes.PortSupportedClassofService
    $a_MSFC_FibrePortHBAAttributes[ $a_MSFC_FibrePortHBAAttributes[0][0] ][11] = $o_FCPort.Attributes.PortSupportedSpeed
    $a_MSFC_FibrePortHBAAttributes[ $a_MSFC_FibrePortHBAAttributes[0][0] ][12] = $o_FCPort.Attributes.PortType

    Da hätte ich ja auch schon eher drauf kommen können .....

  • WMI Abfrage - Ich kann den Typ nicht bestimmen

    • BLinz
    • 11. November 2015 um 17:39

    So, hatte wieder Zeit zum testen und ausprobieren.

    In AutoIt bin ich noch nicht weiter ... aber ich habe mir gedacht "schau wie du die Daten auch anders bekommen kannst".

    In einer DOS-Box bekomme ich mit winrm ein recht schöne Ausgabe:

    Code
    C:\Windows\System32>winrm e wmi/root/wmi/MSFC_FibrePortHbaAttributes
    MSFC_FibrePortHBAAttributes
        Active = true
        Attributes
            FabricName = 16, 0, 80, 235, 26, 182, 26, 152
            NodeWWN = 32, 0, 0, 36, 255, 56, 50, 72
            NumberofDiscoveredPorts = 2
            PortActiveFc4Types = 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
            PortFcId = 2103040
            PortMaxFrameSize = 2048
            PortSpeed = 16
            PortState = 2
            PortSupportedClassofService = 8
            PortSupportedFc4Types = 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
            PortSupportedSpeed = 26
            PortType = 5
            PortWWN = 33, 0, 0, 36, 255, 56, 50, 72
        HBAStatus = 0
        InstanceName = PCI\VEN_1077&DEV_2532&SUBSYS_015D1077&REV_02\4&3814a808&0&0008_0
        UniquePortId = 18446738029665845256
    
    
    MSFC_FibrePortHBAAttributes
        Active = true
        Attributes
            FabricName = 16, 0, 80, 235, 26, 182, 18, 184
            NodeWWN = 32, 0, 0, 36, 255, 56, 50, 73
            NumberofDiscoveredPorts = 2
            PortActiveFc4Types = 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
            PortFcId = 2037504
            PortMaxFrameSize = 2048
            PortSpeed = 16
            PortState = 2
            PortSupportedClassofService = 8
            PortSupportedFc4Types = 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
            PortSupportedSpeed = 26
            PortType = 5
            PortWWN = 33, 0, 0, 36, 255, 56, 50, 73
        HBAStatus = 0
        InstanceName = PCI\VEN_1077&DEV_2532&SUBSYS_015D1077&REV_02\4&3814a808&0&0108_0
        UniquePortId = 18446738029668311048
    Alles anzeigen


    Funktioniert aber schon mal nicht remote ... ich habe mir den Quelltext der zu Grunde liegenden winrm.vbs angesehen (gibt es auf jedem Windows Rechner/Server) .. aber besonders lesbar war das nicht.

    Nächster Versuch: wimc

    Code
    C:\Windows\System32>wmic /NameSpace:\\root\wmi path "MSFC_FibrePortHbaAttributes" get
    Active  HBAStatus  InstanceName                                                      UniquePortId
    
    
    
    
    
    
    TRUE    0          PCI\VEN_1077&DEV_2532&SUBSYS_015D1077&REV_02\4&3814a808&0&0008_0  18446738029665845256
    
    
    
    
    
    
                                                                                         {}                    13    MSFC_HBAPortAttributesResults    MSFC_HBAPortAt
    tributesResults  2  {16, 0, 80, 235, 26, 182, 26, 152}  {32, 0, 0, 36, 255, 56, 50, 72}  2  {0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
    , 0, 0, 0, 0, 0, 0, 0, 0, 0}  2103040  2048  16  2  8  {0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}  26  5
    {33, 0, 0, 36, 255, 56, 50, 72}
    TRUE    0          PCI\VEN_1077&DEV_2532&SUBSYS_015D1077&REV_02\4&3814a808&0&0108_0  18446738029668311048
    
    
    
    
    
    
                                                                                         {}                    13    MSFC_HBAPortAttributesResults    MSFC_HBAPortAt
    tributesResults  2  {16, 0, 80, 235, 26, 182, 18, 184}  {32, 0, 0, 36, 255, 56, 50, 73}  2  {0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
    , 0, 0, 0, 0, 0, 0, 0, 0, 0}  2037504  2048  16  2  8  {0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}  26  5
    {33, 0, 0, 36, 255, 56, 50, 73}
    Alles anzeigen


    Die Ausgabe ist zwar ... Bescheiden aber es sind alle Daten da, man könnte sich die so herausziehen ... zudem funzt wmic auch Remote.

    Aber am liebsten wäre mir doch das ganze nativ in AutoIt selbst ....

  • WMI Abfrage - Ich kann den Typ nicht bestimmen

    • BLinz
    • 9. November 2015 um 18:28

    Ich schreib gerade ein CLI-Tool welches mir Daten von FC (Fibre Channel) Adapter abfragt.
    Dazu gibt es jede Menge WMI Klassen: Link zu den Beschreibungen der MPIO-Klassen

    MPIO_DISK_INFO
    MPIO_DISK_HEALTH
    MSFC_FCAdapterHBAAttributes

    habe ich schon erfolgreich umgesetzt,
    immer nach dem gleichen Schema:

    AutoIt
    Func _Get_MSFC_FCAdapterHBAAttributes()
    	Local $o_WMIService ; Zeiger auf das WMI
    	Local $o_msfc_FCAdapter ; Zeiger auf die ganze MSFC_FCAdapterHBAAttributes Klasse
    	Local $o_FCAdapters ; Zeiger auf das Array mit den HBA Adaptern
    	Local $o_nodeWWN ; Zeiger auf das Array der WWN des Adapters
    	$o_WMIService = ObjGet("winmgmts:\\" & $s_TargetHost & "\root\WMI")
    	$o_msfc_FCAdapter = $o_WMIService.ExecQuery("SELECT * FROM MSFC_FCAdapterHBAAttributes", "WQL", 0x10 + 0x20)
    	If IsObj($o_msfc_FCAdapter) then
    		For $o_FCAdapters In $o_msfc_FCAdapter
    			$a_MSFC_FCAdapterHBAAttributes[0][0] = $a_MSFC_FCAdapterHBAAttributes[0][0] + 1
    			ReDim $a_MSFC_FCAdapterHBAAttributes[ $a_MSFC_FCAdapterHBAAttributes[0][0] + 1 ][19]
    			$a_MSFC_FCAdapterHBAAttributes[ $a_MSFC_FCAdapterHBAAttributes[0][0] ][1] = $o_FCAdapters.Active
    			; und so weiter ....
    		Next
    	EndiF
    EndFunc
    Alles anzeigen


    Doch nun versuche ich mich an der Klasse "MSFC_FibrePortHBAAttributes"
    https://msdn.microsoft.com/en-us/library/…0(v=vs.85).aspx
    welche als Rückgabe (soweit komme ich noch) diese Struktur zurückgibt: https://msdn.microsoft.com/en-us/library/…9(v=vs.85).aspx
    Ein Teil dieser Rückgabe ist die Eigenschaft/Wert/Struktur Attributes : https://msdn.microsoft.com/en-us/library/…0(v=vs.85).aspx

    Ich greife auf "Attributes" per

    AutoIt
    <em>$o_WMIService = ObjGet("winmgmts:\\" & $s_TargetHost & "\root\WMI")</em>
    <em>	$o_msfc_FCPorts = $o_WMIService.ExecQuery("SELECT * FROM MSFC_FibrePortHBAAttributes", "WQL", 0x10 + 0x20)</em>
    <em>	If IsObj($o_msfc_FCPorts) then</em>
    <em>		For $o_FCPort In $o_msfc_FCPorts</em>
    <em>			$o_FCAttributes = $o_FCPort.Attributes</em>
    <em>				For $o_FCSinglePort In $o_FCAttributes</em>

    Wenn ich $o_FCAttributes Teste so ist es vom Typ Object. Leider kann ich auf keinerlei Werte der Struktur Zugreifen. Da sind zwar auch ein paar Arrays drin, aber auch direkte Werte wie "PortSpeed"


    Nutze ich Powershell ist das "ganz easy":

    Code
    PS C:\> gwmi -Namespace root\wmi -Class MSFC_FibrePortHbaAttributes
    
    
    
    
    __GENUS          : 2
    __CLASS          : MSFC_FibrePortHBAAttributes
    __SUPERCLASS     :
    __DYNASTY        : MSFC_FibrePortHBAAttributes
    __RELPATH        : MSFC_FibrePortHBAAttributes.InstanceName="PCI\\VEN_1077&DEV_2532&SUBSYS_015D1077&REV_02\\4&3814a808&
                       0&0008_0"
    __PROPERTY_COUNT : 5
    __DERIVATION     : {}
    __SERVER         : TESTSERVER
    __NAMESPACE      : root\wmi
    __PATH           : \\ECESRV182A\root\wmi:MSFC_FibrePortHBAAttributes.InstanceName="PCI\\VEN_1077&DEV_2532&SUBSYS_015D10
                       77&REV_02\\4&3814a808&0&0008_0"
    Active           : True
    Attributes       : System.Management.ManagementBaseObject
    HBAStatus        : 0
    InstanceName     : PCI\VEN_1077&DEV_2532&SUBSYS_015D1077&REV_02\4&3814a808&0&0008_0
    UniquePortId     : 18446738029665845256
    
    
    __GENUS          : 2
    __CLASS          : MSFC_FibrePortHBAAttributes
    __SUPERCLASS     :
    __DYNASTY        : MSFC_FibrePortHBAAttributes
    __RELPATH        : MSFC_FibrePortHBAAttributes.InstanceName="PCI\\VEN_1077&DEV_2532&SUBSYS_015D1077&REV_02\\4&3814a808&
                       0&0108_0"
    __PROPERTY_COUNT : 5
    __DERIVATION     : {}
    __SERVER         : TESTSERVER
    __NAMESPACE      : root\wmi
    __PATH           : \\ECESRV182A\root\wmi:MSFC_FibrePortHBAAttributes.InstanceName="PCI\\VEN_1077&DEV_2532&SUBSYS_015D10
                       77&REV_02\\4&3814a808&0&0108_0"
    Active           : True
    Attributes       : System.Management.ManagementBaseObject
    HBAStatus        : 0
    InstanceName     : PCI\VEN_1077&DEV_2532&SUBSYS_015D1077&REV_02\4&3814a808&0&0108_0
    UniquePortId     : 18446738029668311048
    
    
    
    
    
    
    PS C:\> gwmi -Namespace root\wmi -Class MSFC_FibrePortHbaAttributes | Select -Expandproperty Attributes
    
    
    
    
    __GENUS                     : 2
    __CLASS                     : MSFC_HBAPortAttributesResults
    __SUPERCLASS                :
    __DYNASTY                   : MSFC_HBAPortAttributesResults
    __RELPATH                   :
    __PROPERTY_COUNT            : 13
    __DERIVATION                : {}
    __SERVER                    :
    __NAMESPACE                 :
    __PATH                      :
    FabricName                  : {16, 0, 80, 235...}
    NodeWWN                     : {32, 0, 0, 36...}
    NumberofDiscoveredPorts     : 2
    PortActiveFc4Types          : {0, 1, 0, 0...}
    PortFcId                    : 2103040
    PortMaxFrameSize            : 2048
    PortSpeed                   : 16
    PortState                   : 2
    PortSupportedClassofService : 8
    PortSupportedFc4Types       : {0, 1, 0, 0...}
    PortSupportedSpeed          : 26
    PortType                    : 5
    PortWWN                     : {33, 0, 0, 36...}
    
    
    __GENUS                     : 2
    __CLASS                     : MSFC_HBAPortAttributesResults
    __SUPERCLASS                :
    __DYNASTY                   : MSFC_HBAPortAttributesResults
    __RELPATH                   :
    __PROPERTY_COUNT            : 13
    __DERIVATION                : {}
    __SERVER                    :
    __NAMESPACE                 :
    __PATH                      :
    FabricName                  : {16, 0, 80, 235...}
    NodeWWN                     : {32, 0, 0, 36...}
    NumberofDiscoveredPorts     : 2
    PortActiveFc4Types          : {0, 1, 0, 0...}
    PortFcId                    : 2037504
    PortMaxFrameSize            : 2048
    PortSpeed                   : 16
    PortState                   : 2
    PortSupportedClassofService : 8
    PortSupportedFc4Types       : {0, 1, 0, 0...}
    PortSupportedSpeed          : 26
    PortType                    : 5
    PortWWN                     : {33, 0, 0, 36...}
    Alles anzeigen

    Ich muss also etwas wie "Select -Expandproperty Attributes" in AutoIt machen ... stehe aber gerade ziemlich auf dem Schlauch ....


    Gruß,
    BLinzler

  • Aktualisierung der Exe

    • BLinz
    • 24. April 2014 um 12:03

    Folgende Idee (habe ich für einen Update so ähnlich umgesetzt):

    • Es wird nicht mehr mit der Exe aus dem Netzlaufwerk sondern mit einer lokalen Kopie gearbeitet!
    • Die .exe wird vom Netzlaufwerk gestartet - und merkt dieses anhand z.B. des Scriptpfades
    • Stellt diese fest das das sie von einem Netzlaufwerk gestartet wurde kopiert diese sich nach lokal (z.B. Temp)
    • und startet sich selbst aus der lokalen Version noch einmal, die Netzwerkwerk Variante beendet sich.
    • Die lokale Version macht den gleichen Test (oder du übergibst Ihr einen Schalter), stellt fest das alles ok ist und zeigt die GUI an.


    So kannst du die Netzwerk-variante austauschen und beim nächsten Start hat der Benutzer dann die neue Version.


    Für Fortgeschrittene und Dauerbenutzer: mach einen Test alle z.B. 60 Minuten ob eine neuere Version im Netzwerk liegt und benachrichtige den Benutzer ggf.


    Bernhard

  • PDF erstellen - geht es etwas komfortabler?

    • BLinz
    • 25. März 2014 um 19:40

    Eine Lösung mit dem PDF-Creator hatte ich auch schon gesehen.

    Ich würde es aber halt gern "nativ" lösen - also nur mit AutoIt und nicht mit einem Drittherstellerprodukt. Die .Exe die ich baue soll sich selbst genug sein.

    Es wird wohl auf ein ruhiges Wochenende hinauslaufen an welchem ich mir so eine Art Seiten-Engine selber bauen muss ...


    Bernhard

  • PDF erstellen - geht es etwas komfortabler?

    • BLinz
    • 20. März 2014 um 12:31

    Moin Moin,

    ich habe in AutoIt ein Reporting-Tool für Zabbix geschrieben welche die Berichte über Word ausgibt.
    Dabei kann ich einfach eine vorher angepasste Dokumentvorlage verwenden (Hoch- oder Querformat, Kopf und Fußzeile, Logo etc.) und es hinterher als Word-Dokument oder auch als PDF usw. speichern.

    Das klappt auch prima - nur das dann eben auch ein Microsoft Word auf dem rechner installiert sein muss.

    Nun bin ich nach kurzer suche auf eine PDF-UDF gestoßen: http://www.autoitscript.com/forum/topic/11…lication/page-8

    Die war schnell eingebunden und die ersten Test-PDF erstellt.
    Nun muss ich mich bei dieser PDF aber auch um alles kümmern.

    • Für jeden Text und jede Grafik muss ich die genaue Position angeben
    • Ich muss prüfen ob denn überhaupt alles auf eine Seite passt oder ob etwas auf die nächste Seite muss
    • bei einer anderen Schriftgröße müsste ich wieder neu schauen wie es passt (oder mir etwas ausdenken es zu berechnen)
    • usw.

    Bei Word ist es egal - wenn der Text die Grafik nicht mehr auf die Seite passt kommt es autoamtisch auf eine neue Seite. Wenn ich expilzit eine neue Seite haben will sende ich einfach einen entsprechenden Befehl.

    Kurz gesagt will ich da nicht alles neu erfinden sondern etwas wo ich meine Inhalt einfach "hineinwerfe" und diese dann in der Reihenfolge als DIN-A4 PDF Seiten wieder herauskommt.

    Es kenn nicht zufällig jemand eine Lösung? Eventuell mit Zwischenschritten über ein anderes Format?

    Danke im vorraus,

    BLinz

  • AutoIT und Linux?

    • BLinz
    • 19. November 2013 um 00:27
    Zitat von Micha_he

    Achtung: Bei SSH-Verbiindungen muss einmal vorab der Hostkey manuell bestätigt werden !

    Jepp, das Problem hatte ich auch mal und das nervte, so habe ich es umgangen:

    [autoit]


    Func _saveplinkRSAkey($plinkHost)
    $plinkFile = @ScriptDir & "\plink.exe"
    $runThis = @ComSpec & " /c " & "echo yes | " & $plinkFile & " " & $plinkHost
    ;ConsoleWrite($runThis & @CRLF)
    $plinkhandle = Run($runThis, "", @SW_HIDE, $STDIN_CHILD + $STDOUT_CHILD + $STDERR_CHILD)
    Sleep(5000)
    If ProcessExists($plinkhandle ) Then ProcessClose($plinkhandle )
    EndFunc ;==>_saveplinkRSAkey

    [/autoit]

    Ich rufe vor meinen eigentlichen plink.exe Aufrufen einmal die Funktion zuvor auf - die Stellt eine Verbindung her und beantwortet die Frage ob der Schlüssel ok ist und gespeichert werden soll gleich mit ja.
    Ich nutze das sonst zur Verbindung zu Storage-Systemen, habs mal eben an Linux angepasst ... was besseres als die 5 Sekunden Pause fiel mir gerade nicht ein

    BLinz

  • Wie wurde Programm gestartet? In cmd.exe (DOS-Box) oder Verknüpfung / Doppelklick / Explorer

    • BLinz
    • 29. Oktober 2013 um 23:14

    Prima chesstiger - da hab ich doch den vermissten Ansatz.

    Als Dank gibt es die direkte WMI Version deines Skripts ... die könnte noch 2 Schritte kleiner sein, leider weis ich nicht genau was ich zurück bekomme wenn ich direkt nach dem ParentProcess frage.

    [autoit]

    ; Fehler Abfangen bei Zugriff auf WMI Schnittstelle
    Global $oMyError = ObjEvent("AutoIt.Error","MyErrFunc"), $f_COMError = False

    [/autoit][autoit][/autoit][autoit]

    ; ##################################################################################################################################
    ; Im Fehlerfall wird diese Routine aufgerufen
    Func MyErrFunc()
    Local $HexNumber=hex($oMyError.number,8)
    Msgbox(0,"","We intercepted a COM Error !" & @CRLF & _
    "Number is: " & $HexNumber & @CRLF & _
    "WinDescription is: " & $oMyError.windescription & @CRLF & _
    "Source is: " & $oMyError.source & @CRLF & _
    "ScriptLine is: " & $oMyError.scriptline)
    $f_COMError = True; something to check for when this function returns
    Endfunc

    [/autoit][autoit][/autoit][autoit]

    ; ##################################################################################################################################
    Func _GetParentExecutableFileWMI()
    ;1. Version by chesstiger (autoit.de)
    ;2. Version by BLinz (autoit.de)
    ; WMI Objekt holen
    $oWMI = ObjGet("winmgmts:{impersonationLevel=impersonate,authenticationLevel=pktPrivacy, (Debug)}!\\.\root\cimv2")
    ; Wenn es geklappt hat ....
    If IsObj($oWMI) Then
    ;Infos über unseren Prozess holen
    $colProcs = $oWMI.ExecQuery("select * from win32_process where ProcessId = " & @AutoItPID)
    ;Parent Prozess holen
    For $oProc In $colProcs
    $iParentPID = $oProc.ParentProcessId
    Next
    EndIf
    ; Liste aller Prozesse in einem Array holen
    $aProcesses = ProcessList()
    ; Unseren Parent-Prozess suchen
    For $i = 0 To $aProcesses[0][0]
    If $aProcesses[$i][1] = $iParentPID Then
    Return SetExtended($iParentPID, $aProcesses[$i][0])
    EndIf
    Next
    EndFunc

    [/autoit][autoit][/autoit][autoit]

    ; ##################################################################################################################################
    ; Hauptprogramm

    [/autoit][autoit][/autoit][autoit]

    $sParentEXE = _GetParentExecutableFileWMI()
    $iPID = @extended

    [/autoit][autoit][/autoit][autoit]

    MsgBox(0, "", "Der Parent-Prozess heißt: " & $sParentEXE & "." & @CRLF & "Er hat die PID: " & $iPID & ".")

    [/autoit]

    Funktioniert EINWANDFREI sowohl als GUI oder CUI kompliert !!! Genau das was ich suchte! :D

    Gruß,
    BLINZ

  • Wie wurde Programm gestartet? In cmd.exe (DOS-Box) oder Verknüpfung / Doppelklick / Explorer

    • BLinz
    • 29. Oktober 2013 um 20:35

    *g* Genau, die Antwort ist gar nicht so einfach - falls sie überhaupt möglich ist ..

  • [Beispiel] - Fenster Sliden (hinein- hinausgeleiten) auf dem Desktop - optimiert für Multi-Monitorlösungen

    • BLinz
    • 29. Oktober 2013 um 19:51

    Hab Dank, habe es in den ersten Post mit eingearbeitet.

  • Wie wurde Programm gestartet? In cmd.exe (DOS-Box) oder Verknüpfung / Doppelklick / Explorer

    • BLinz
    • 29. Oktober 2013 um 19:41

    Moin,

    vielleicht steht es schon irgendwo aber ich finde es nicht:

    Kann man irgendwie Feststellen WIE mein AutoIt Programm gestartet wurde?

    Hintergrund:
    Ich habe ein Programm geschrieben mit dem man per Command-Line Parametern ($CmdLine[x]) sich mit einem Zabbix Server verbindet und Werte abfragt etc.
    Startet man das Programm ohne Parameter so wird eine Hilfe angezeigt.

    Das Programm ist als "CUI instead of GUI EXE" kompiliert.

    Nun würde ich aber gerne einen Dialog anzeigen wenn das Programm statt in der DOS-Box per Doppelklick etc. gestartet wurde - kann ich irgendwie feststellen wie es gestartet wurde?

    Wenn es dazu als normale GUI-EXE kompiliert werden muss ... nun irgendwo hatte ich ein Beispiel wie man trotzdem in die DOS-Box schreibt ... aber mir fehlt trotzdem noch der Ansatz.

    Danke,
    BLinz

  • [Beispiel] - Fenster Sliden (hinein- hinausgeleiten) auf dem Desktop - optimiert für Multi-Monitorlösungen

    • BLinz
    • 27. Oktober 2013 um 09:23

    Lösung .. Jein.

    Ich habe bereits ein Tool geschrieben welches sinnvolle Seiten in einer Multi-Mon-Konfiguration erkennt:

    [Beispiel] - Multi-Monitorkonfiguration ermitteln, grafisch darstellen und die Ränder der Monitore zueinander bzw. freie Ränder finden

    Das müsste man jetzt nur noch verbinden ..... *g*

    BLinz

  • [Beispiel] - Fenster Sliden (hinein- hinausgeleiten) auf dem Desktop - optimiert für Multi-Monitorlösungen

    • BLinz
    • 19. September 2013 um 10:07

    Artur Babecki aus Polen hatte mich angeschrieben und einen Fehler in der Demo entdeckt.

    Und zwar wenn der Benutzer das Fenster von Hand nach außerhalb des Bildschirms verschiebt kommt es zu einem dauersliden.
    Passiert z.B. wenn man das Fenster per Button rechts an den Rand heftet und dann das Fenster nach links aus dem Bildschirm schiebt - reicht das die linke obere Ecke außerhalb des Bildschirms ist.

    Korrigierte Fassung 2.1 im ersten Post eingefügt

    BLinz

  • Upload einer Datei per POST Multipart ( winhttprequest / InetGet )

    • BLinz
    • 12. August 2013 um 14:48

    Nachtrag:

    Mit Curl für Windows habe ich es dann doch hinbekommen (Download unter http://curl.haxx.se/download.html :(

    [autoit]

    curl.exe -k -F "FileUpload=@D:\Bestandsabgleich\Priceminister\PM-Bestand-2013-08-12-V1.csv" "https://ws.priceminister.com/stock_ws?action=import&login=BENUTZERNAME&pwd=BENUTZERID&version=2010-09-20&mappingalias=QUANTITY"

    [/autoit]


    Aber ich mag nicht unbedingt externe Programme aufrufen ....

  • Upload einer Datei per POST Multipart ( winhttprequest / InetGet )

    • BLinz
    • 12. August 2013 um 13:38

    Moin,

    ich bastle gerade für einen bekannten einen Waren-Bestandsabgleich für seinen Webshop. Das habe ich schon für verschiedene Plattformen mit AutoIt prima hinbekommen - in der Regel muss man sich die Daten der Artikel aus der Datenbank holen und in einer Text-Datei richtig aufbereiten - mit AutoIt ein Kinderspiel.

    Nun nutzt er eine weitere Plattform (Pricemnister.com) - die machen den Up- und Download über https-Request.

    Den aktuellen Artikelbestand z.B. mit InetGet abzurufen klappe schon nach 2 Minuten probieren in AutoIt:

    [autoit]


    Dim $sDownloadpath = "D:\Bestandsabgleich\Priceminister\priceminister.xml"
    $iSize = InetGet('https://ws.priceminister.com/stock_ws?action=export&login=BENUTZERNAME&pwd=BENUTZERID&version=2012-10-23', $sDownloadpath, 2, 0)

    [/autoit]


    wenn $iSzte größer als 0 ist hat alles geklappt und ich meine Artikel-Datei unter "D:\Bestandsabgleich\Priceminister\priceminister.xml".

    Das klappt ja und schreibe es auch nur um die Syntax zu verdeutlichen - man muss also eine entsprechende URL aufrufen und löst damit das gewünschte auf den Server aus.

    Nun will ich aber eine Datei mit den aktuellen Artikelbestand hochladen.

    Die Datei ist simpel aufgebaut:

    [autoit]


    sku;quantity
    10001;344
    10002;376
    10003;267

    [/autoit]


    Es ist eine schnöde Textdatei im CSV Format wo zuerst die Artikelnummer und dann der Bestand kommt.

    Auch zum übertragen dieser Datei muss ich wieder eine bestimmte URL aufrufen - aber diesmal dann die Datei im "Multipart Modus" anhängen.
    Die URL ist

    https://ws.priceminister.com/stock_ws?action=import&login=BENUTZERID&pwd=BENUTZERIDversion=2010-09-20&mappingalias=QUANTITY

    Naja, soweit ich es verstanden habe omme ich nun mit InetGet nicht weiter - ich habe hier kein "POST" - heisst ja auch "InetGet".
    Etwas gegoogelt und festgestellt das man z.B. das ganze auch per "winhttprequest" Object machen kann.

    Meinen InetGet-Aufruf bekam ich auch schnell nachgebaut .... woran ich scheitere ist die Datei daran zu hängen und zu senden ...
    Es gibt ganz viele Beispiele im Internet für AutoIt und VBA etc über den Aufruf der Post-Methode ... aber da wird immer nur eine Eingabe etc. gesendet - über ein "Multipartfile" war nichts dabei was sich mir erschlossen hätte.

    Hier mein Code - ist nur der Prototyp für den Funktionstest - habe ich mir aus einem englischen Beispiel kopiert und nur angepasst.

    [autoit]


    $sDaten = FileRead("D:\Bestandsabgleich\Priceminister\PM-Bestand-2013-08-12-V1.csv")

    [/autoit][autoit][/autoit][autoit]

    $oHTTP = ObjCreate("winhttp.winhttprequest.5.1")
    ;Post request
    $oHTTP.Open("POST", "https://ws.priceminister.com/stock_ws?action=import&login=BENUTZERNAME&pwd=BENUTZERID&version=2010-09-20&mappingalias=QUANTITY" , False)
    ;Add User-Agentheader
    $oHTTP.SetRequestHeader("User-Agent", "Mozilla/5.0 (Windows; U; Windows NT 6.1; de-DE; rv:1.9.0.10) Gecko/2009042316 Firefox/3.0.10 (.NET CLR 4.0.20506)")
    ;Add Referrer
    ;header$oHTTP.SetRequestHeader("Referrer", "http://www.REFERRERURL.com")
    ;Add Content-Type
    $oHTTP.SetRequestHeader("Content-Type", "multipart/form-data")
    ;$oHTTP.SetRequestHeader("Content-Type", "application/x-www-form-urlencoded")
    ;Send POST request
    $oHTTP.Send($sDaten)
    ;Get received data
    $oReceived = $oHTTP.ResponseText
    ConsoleWrite($oReceived)

    [/autoit]

    Hier habe ich versucht die Datei einfach einzulesen und dann per "$oHTTP.Send($sDaten)" zu senden - nein das geht nicht ...
    Ich habe auch schon probiert:
    * den Text in der Datei einfach zu senden
    * den Text in Binary umzuwandeln und zu senden

    Vom Server bekomme ich immer ein Fehlermeldung:

    [autoit]

    <message>Server not able to fullfill request.</message>
    <details>
    <detail><![CDATA[An error occurred while submitting the file]]></detail>
    </details>
    </error>

    [/autoit]

    Im Beitrag Fileuplaod via POST habe ich gesehen das die Daten doch mehr aufbereitet werden müssen?

    Im Moment hat es bei mir noch nicht "klick" gemacht und ich das ganze noch nicht durchschaut .... ich hab mir auch schon die Windows-Version von CURL geholt ... aber das Ding erschlägt mich auch mit Parametern und die Bespiele sind dünn.

    Bin für jeden Tipp dankbar,

    BLinzer

Spenden

Jeder Euro hilft uns, Euch zu helfen.

Download

AutoIt Tutorial
AutoIt Buch
Onlinehilfe
AutoIt Entwickler
  1. Datenschutzerklärung
  2. Impressum
  3. Shoutbox-Archiv
Community-Software: WoltLab Suite™