AutoIt + WinSCP = leichte Verzweiflung

  • Hallo AutoIt-Füchse.
    Ich hoffe hier sind die einen oder anderen dabei die auch Erfahrung mit WinSCP (oder ähnlichem) haben.
    Ich soll mittels AutoIt und WinSCP ein Programm zum sichern von Dateien machen.
    Ansich alles kein Problem, nur muss ich immer die aktuellsten Daten runterladen....und hier beginnt mein Problem.
    Kennt jemand eine Methode, mit der AutoIt oder WinSCP den Namen der Datei in eine Text- oder Logdatei schreiben kann??....Wie ich nach der aktuellesten Datei suche ist mir schon einigermaßen klar nur brauch ich halt diesen Namen^^

    Hoffe mir kann wer helfen

  • naja......also hab soweit ein log erstellt.
    da ich ja mit winscp das ganze machen muss sieht das dort folgendermaßen aus

    [autoit]

    ShellExecute("C:\Program Files\WinSCP\WinSCP.com","/log=""C:\Backuptool\"&$server[$i][1]&".xml")

    [/autoit]

    damit ich aber an die benötigten informationen, also vollständiger dateiname und so, herankommen kann, musste ich das als xml speichern.
    nun aber das nächste problem....wie kann ich meinem programm sagen, dass ich nur bestimmte dateinamen brauch, also die mit dem aktuellsten datum, was aber je nach server unterschiedlich sein kann:
    serverx.xml: ordnera1 2009-09-09
    ordnera1 2009-09-08
    ordnerb1 2009-09-09
    ordnerb2 2009-09-08
    servery.xml: datei1 2009-09-08
    datei2 2009-09-01

    also müsste ich von serverx ordnera1 2009-09-09 und ordnerb1 2009-09-09 und von servery datei1 2009-09-08.
    ende vom lied soll sein, dass der vollständige pfad in eine weitere datei(.log oder .ini) eingelesen werden soll, von der aus dann der download gesteuert werden soll. das hab ich soweit schon, nur fehlen mir halt die informationen aus den ganzen xml dateien.
    und ja, es wird für jeden analysierten server eine eigene xml erstellt^^

  • Hi,

    muss es denn unbedingt Winscp sein? Wie wärs mit Robocopy? Die Datei ist standardmäßig bei Windows Vista und Server 2008 enthalten, kann aber auch unter XP und Server 2003 verwendet werden.
    Damit kannst du nämlich z.B. anhand der Zeit/Datumsstempel von Dateien bestimmen, welche du sichern willst, z.B nur neuere. Du kannst ganze Verzeichnisse kopieren und dabei leere Ordner weglassen. Außerdem gibt es noch die Möglichkeit Quelldateien nach dem Kopiervorgang zu löschen... Es gibt da gefühlte 1000 Schalter, die man setzen kann und unterschiedlich kombinieren kann. Es werden auch versteckte Dateien gefunden, und du kannst auch bestimmte Dateien ausschließen...

    Wenn du etwas genaueres wissen möchtest, dann frag einfach. Meines Wissens nach kennt sich Alina auch super damit aus...

    So far...

  • Ja es muss.....war so die Vorgabe -.-
    An sich wäre es ja kein Problem.
    Muss ja nur noch diese .xml Dateien analysieren und den richtigen Dateinamen rauslesen....danach ist alles eigentlich kein Problem mehr^^ *hoffnung*
    Also weis wer wie das einigemaßen einfach geht?

  • haste mal ein beispiel? Also wie so ne xml- datei dann aussieht?
    Wenn es da unterschiede gibt, dann musst du die ja auch beachten...

  • Spoiler anzeigen


    hier brauch ich halt das aktuellste Cobian und das aktuellste backup
    oder

    Spoiler anzeigen


    hier halt die aktuellste tgz

    die restlichen xml sind gleich aufgebaut

  • wenn ich das richtig sehe, sind die letzten Einträge ja immer die neuesten, da müsstest du nur gucken, wo <filename...> das letzte mal vorkommt. Oder du liest alle aus und fügst sie in ein Array ein und kannst dann da das neueste rausfiltern.

    Mit dem Array wär schon praktisch, weil du das bei beiden Versionen nehmen kannst... Sonst müsstest du ja immer das "value=" genau angeben.

    Oder mach ich jetzt nen Denkfehler?

  • wie wäre die array variante...glaub die klingt logisch.
    sorry dass ich soviel frage, aber bin halt nur n fisi und meine programmierkenntnisse sind sehr begrenzt :(

  • Hab mal nen Anfang...


    Du brauchst die XML.datei aufm desktop und eine TextDatei, oder pass einfach die Pfade an...

    Spoiler anzeigen
    [autoit]

    #include <File.au3>
    #include <Array.au3>
    #include <String.au3>

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

    $file = @DesktopDir & "\test.xml"
    $ini = @DesktopDir & "\INI.txt"
    Dim $arrayfile
    Dim $neu
    Dim $name

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

    _FileReadToArray($file, $arrayfile)
    ;_ArrayDisplay($arrayfile)
    $neu = _ArrayFindAll($arrayfile, "filename","","","",1)
    ;_ArrayDisplay($neu)

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

    $i=1
    While $i < Ubound($neu)
    $x = $neu[$i]
    $name = _StringBetween($arrayfile[$x],'"','"')
    If StringInStr($name[0],"Cobian") Then
    $var = StringRight($name[0],19)
    IniWriteSection($ini,"Cobian",$var)

    ElseIf StringInStr($name[0],"backup") Then
    $var = StringRight($name[0],19)
    IniWriteSection($ini,"backup",$var)
    EndIf

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

    $i = $i+1

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

    WEnd

    [/autoit]

    Damit werden die Werte in eine Ini geschrieben, da musst du dir jetzt das aktuellste suchen, also der letzte Eintrag pro Sektion.

    geht wahrscheinlichh auch alles einfacher, aber ich bin nicht der King-Of-Arrays... ;)

  • Wer die Hilfe lesen kann ist definitiv im Vorteil -.-
    Hab jetzt mit _FileReadToArray des XML in n Array umgewandelt.

    Jetzt wollt ich mit StringInStr nach dem Wert <modification value=
    Kann mir da noch einer erklären wie das genau geht mit dem Befehl.....die Beispiele im Internet sind nur für normale Textdateien.

    Also mein Ziel (das ich mit eurer Hilfe) das ich erreichen will.....AutoIt soll jetzt im Array nach <modification value= suchen und dann halt Jahr, Monat und Tag vergleichen.

    Spoiler anzeigen
    [autoit]


    For $x = 1 to $array[0]
    Msgbox(0,'Record:' & $x, $array[$x]) ;war nur dafür da, zu testen ob das Array vorhanden ist
    If (StringInStr($array[$x],"<modification value=")) = True Then
    ..... hier soll das Datum verglichen werden....StringRegExp oder StringRegExpReplace hab ich in diesem Zusammenhang gelesen, aber über den richtigen gebrauch...
    EndIf
    Next

    [/autoit]
    • Offizieller Beitrag

    Meinst Du so:

    Spoiler anzeigen
    [autoit]


    $sPath = @ScriptDir & '\test.xml' ; Pfad ggf. anpassen
    $sFile = FileRead($sPath)
    $aData = StringRegExp($sFile, '(?s)<file>.*?<filename value="(.+?)".*?<modification value="(.+?)".*?</file>', 3)
    $sDate = '0000-00-00'
    $iIndex = 0
    For $i = 0 To UBound($aData) - 1 Step 2
    If StringLeft($aData[$i + 1], 10) > $sDate Then
    $sDate = StringLeft($aData[$i + 1], 10)
    $iIndex = $i
    EndIf
    Next
    MsgBox(0, 'Datei mit neuestem Datum:', $aData[$iIndex])

    [/autoit]


    Hab zum testen die XML-Datei mit den tgz-Einträgen genommen.


  • Ansich alles kein Problem, nur muss ich immer die aktuellsten Daten runterladen....und hier beginnt mein Problem.

    Hi,
    Autoit brauchstd doch eigentlich nur zum steuern von WinSCP. WinSCP kann das selber entscheiden welche die aktuellste Datei ist. Dazu kannst du die Syncronisation in WinSCP nutzen. Dort definiertst du auch die Dateiendungen, die WinScp aktuell halten soll. Das kannst du dann kompt. mit Autoit steuern.

    VG
    ThomasB

    MFG ThomasB

    *
    Ich lese viel und gerne (und wenn ich alle Mahnungen durch habe, schmeiße ich sie weg)
    *

  • Jaaaaaaaaaaaaaaa^^....ich könnt dich küssen :D
    Nur noch eines.....wie macht man das am geschicktesten, bei den XML, die 2 unterschiedliche Einträge haben? (€: also wie z.B. Cobianbackup und Backup)
    Hab gerade mit While, Do und den ganzen anderen Schleifen experimentiert......irgendwie bin ich echt zu doof für die ganze Sache......

    Also hab jetzt deinen Code jetzt mal dupliziert und dann bei der 2.step anweisung ne 4 statt ner 2 verwendet....net schön aber so geht mal^^

    2 Mal editiert, zuletzt von nachtvogel85 (10. September 2009 um 14:47)

  • sag mal, hast du meinen beitrag gar nicht gesehen? oder übersehen? guck dir den mal genau an, oder probier mal aus...
    Ich hab mal die Datei angehängt, mit der ich probiert habe und es hat geklappt..

    So far...