Ordner aus einem Pfad ausfiltern und isolieren (batch umsetzung vorhanden)

  • Hallo liebe gemeinde ;)

    mein problem ist das ich versuche ein programm in autoit zu übersetzen.
    die sache ist die:

    bekannt ist ein teilpfad:
    zB "c:\beispiel\test\"

    bekannt ist es gibt 2 dateien
    zB "datei1.txt" und "datei2.txt"

    bekannt ist, dass zwischen dem teilpfad und den beiden dateien nur ein
    ordner unbekanntem namens liegt
    die beiden dateien sind im selben (unbekannten) ordner
    ziel ist es, den namen des unbekannten ordners heraus zu finden und die
    beiden dateien in den temp-ordner zu kopieren

    dort werden sie gezippt und die zip erhält den namen des eben
    herausgefundenen ordners

    die sache ist das es unter umständen auch mehrere ordner nach dem
    teilpfad geben kann, die diese beiden dateien beinhalten.
    am ende sollten dann im temp-ordner die gezippten dateien aller dieser
    unbekannten ordner der genannten dateien drin sein.

    ist bisschen kompliziert geschrieben aber die lösung ist auf alle fälle
    umzusetzen wenn mans verstanden hat.

    ich bin leider noch nicht lange mit autoit am gange.
    hab das mal in batch umgesetzt das funktioniert und die prozedur brauch
    ich nun in autoit:


    zusammengefasst:

    c:\beispiel\test\unbekannter_ordner1\datei1.txt ---> nach @TempDir & "\unbekannter_ordner1\datei1.txt"
    c:\beispiel\test\unbekannter_ordner1\datei2.txt ---> nach @TempDir & "\unbekannter_ordner1\datei2.txt"
    .
    .
    .
    c:\beispiel\test\unbekannter_ordneX\datei1.txt ---> nach @TempDir & "\unbekannter_ordnerX\datei1.txt"
    c:\beispiel\test\unbekannter_ordnerX\datei2.txt ---> nach @TempDir & "\unbekannter_ordnerX\datei2.txt"

    über eure vorschläge freu ich mich schon und bedanke mich schon mal.

    gruß Inferior

    9 Mal editiert, zuletzt von Inferior (25. Juni 2010 um 13:54)


  • Das sieht für mich nicht nach AutoIt aus...

  • nein behautet auch niemand. das ist batch
    da ich mich dort schon besser auskenne hab ich das dort mal zum laufen gebracht.
    funktioniert auch, aber ich würde das nun gern in autoit haben.

    ist nur von mir gebastelt um nicht ganz mit leeren händen da zu stehn ;)

    jemand eine idee, wie man das am besten in autoIt unsetzt?

  • danke sprenger120!
    das hab ich gesucht ;)

    also wenn ich das richtig verstanden habe:

    ich suche in meinem teil-pfad nach den beiden dateien,
    frage den kopletten dateipfad ab in dem diese dateien liegen
    und wende dann StringSplit an
    die trennzeichen sind in dem fall dann "/"
    und ausfiltern muss ich nur den teilpfad und den dateinamen
    übrig bleibt dann nur der unbekannte ordnername
    diesen hab ich dann in einem array und kann ihn dann weiter verwenden.

    ist das alles richtig so?

    könnte das jemand kurz in einem kleinen beispiel zeigen wie man das in autoIt am besten umsetzt?

    • Offizieller Beitrag

    Den Anfang würde ich so machen:

    Spoiler anzeigen
    [autoit]


    #include <File.au3>
    $sPath = 'c:\beispiel\test\'
    $sFile1 = 'datei1.txt'
    $sFile2 = 'datei2.txt'
    $aDirs = _FileListToArray($sPath, '*', 2) ; das Array $aDirs enthält die Namen der Unterverzeichnisse von $sPath
    If Not @error Then
    For $i = 1 To $aDirs[0] ; alle gefundenen Unterverzeichnisse durchgehen
    If FileExists($sPath & $aDirs[$i] & '\' & $sFile1) Then FileCopy($sPath & $aDirs[$i] & $sFile1, @TempDir & $aDirs[$i] & '\' & $sFile1) ; wenn die Datei existiert nach TempDir kopieren
    If FileExists($sPath & $aDirs[$i] & '\' & $sFile2) Then FileCopy($sPath & $aDirs[$i] & $sFile1, @TempDir & $aDirs[$i] & '\' & $sFile2) ; wenn die Datei existiert nach TempDir kopieren
    Next
    EndIf

    [/autoit]
  • ich suche in meinem teil-pfad nach den beiden dateien,

    [autoit]

    _FileListToArray

    [/autoit]

    frage den kopletten dateipfad ab in dem diese dateien liegen

    [autoit]


    #include <Array.au3>
    Func _DownpathCheck($sPath)
    Local $tmp
    If Not StringInStr($sPath, "\") Then Return SetError(-1, 0, -1)
    $sPath = StringSplit($sPath, "\", 2)
    For $x = UBound($sPath) - 1 To 0
    $tmp = _ArrayToString($sPath, "\")
    If FileExists($tmp) Then Return $tmp
    _ArrayDelete($tmp[$x]
    Next
    Return SetError(-1, 0, -1)
    EndFunc ;==>_DownpathCheck

    [/autoit]

    Ungetestet. Das Prüft die Verzeichnisse runter ob die Datei existiert.

  • also das von oscar sieht schon mal spitze aus und ist an sich logisch aufgebaut
    hab das ganze mal angepasst und getestet aber das autoIt-programm öffnet sich nur für bruchteile einer sekunde und es kopiert nichts
    woran liegt das?

    das von sprenger120 studier ich gerade noch, werd aber aus dem noch nicht so ganz schlau.. erklärung wäre vllt gut

    schon jetzt ein großer dank für euer bemühen!

  • Ach jetze seh ich was du willst also zu meinem Script

    ich sehe gerade das ich nen fehler drinne habe is ja auch egal

    also es sollte gucken ob die Datei in den Überverzeihnissen befinden
    zur erklärung wir nehmen mal C:\Test\Temp\1.txt
    Script guckt in C:\Test\Temp nach 1.txt
    dann in C:\Test\
    und dann in C:\

    und wenn die Datei existiert gibt es den Pfad zurück und wenn nicht -1

    • Offizieller Beitrag

    Mist! Da waren noch ein paar kleine Fehler (man sollte das Skript auch testen). :rolleyes:

    So klappt es aber (getestet):

    Spoiler anzeigen
    [autoit]


    #include <File.au3>

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

    $sPath = 'c:\beispiel\test\'
    $sFile1 = 'datei1.txt'
    $sFile2 = 'datei2.txt'
    $aDirs = _FileListToArray($sPath, '*', 2) ; das Array $aDirs enthält die Namen der Unterverzeichnisse von $sPath
    If Not @error Then
    For $i = 1 To $aDirs[0] ; alle gefundenen Unterverzeichnisse durchgehen
    If FileExists($sPath & $aDirs[$i] & '\' & $sFile1) Then FileCopy($sPath & $aDirs[$i] & '\' & $sFile1, @TempDir & '\' & $aDirs[$i] & '\', 9) ; wenn die Datei existiert nach TempDir kopieren
    If FileExists($sPath & $aDirs[$i] & '\' & $sFile2) Then FileCopy($sPath & $aDirs[$i] & '\' & $sFile1, @TempDir & '\' & $aDirs[$i] & '\', 9) ; wenn die Datei existiert nach TempDir kopieren
    Next
    EndIf

    [/autoit]
  • Sprenger120 nein das hast du leider falsch verstanden

    Oscar , du bist genial ;)

    genau so hab ich mir das vorgestellt. nur ein kleiner fehler ist noch drin.
    er erstellt zwar den neuen ordner mit dem vorher unbekannten namen in einem neuen pfad
    jedoch kopiert er nur datei1.txt
    datei 2.txt die sich auch in dem ordner befindet nicht
    zudem muss das ganze so ausgelegt sein das es unter umständen auch mehrere ordner gibt in denen genau die beiden dateien sich befinden
    es sollen alle kopiert werden wie oben beschrieben:

    c:\beispiel\test\unbekannter_ordner1\datei1.txt ---> nach @TempDir & "\unbekannter_ordner1\datei1.txt"
    c:\beispiel\test\unbekannter_ordner1\datei2.txt ---> nach @TempDir & "\unbekannter_ordner1\datei2.txt"
    .
    .
    .
    c:\beispiel\test\unbekannter_ordneX\datei1.txt ---> nach @TempDir & "\unbekannter_ordnerX\datei1.txt"
    c:\beispiel\test\unbekannter_ordnerX\datei2.txt ---> nach @TempDir & "\unbekannter_ordnerX\datei2.txt"

  • aaah wie peinlich darauf hätte ich wohl auch kommen können.
    jetzt klappt es auch mit der 2. datei ;)

    habs auch mit mehreren versucht und funktioniert.
    es macht genau das was es soll :)
    damit wäre das auch gelöst

    nur noch ne frage wenn wir schon dabei sind:

    ich will diese(n) kopierten ordner zippen
    hab schon mit einer zip.au3 und mit einer 7zip.au3 gearbeitet bisher noch mit wenig erfolg
    einen ineternen befehl ohne zusatz-scripte zu nehmen gibt es bei autoIt nicht oder?

  • hallo autobert,

    danke für den tollen tipp ;)
    hab mir das mal angesehn und mir stellt sich die frage:
    diesen codeschnippsel den BugFix da gebastelt hat muss dann in mein script mit rein oder?
    wie gebe ich den nun an welche datei wohin gezippt werden soll?

    in der beschreibung steht:
    $sPath Pfad der zu erstellenden ZIP-Datei // Bestehenden ZIP-Datei
    $s_a_ToZip String der Einzeldatei oder Array der zu zippenden Dateien
    // Pfad des Zielordners, in den entpackt werden soll
    $fUnZip=True Entpacken=True, Packen=False (Standard)
    $iIndexBase Index Basis (erstes Element mit Pfad) des übergebenen Arrays (0 od.1)
    $fOverwrite Falls $sPath existiert ==> Überschreiben (Standard=True)

    also hab ich geschrieben:

    $sPath = @DesktopDir & "\"
    $s_a_ToZip = @TempDir & "\all\"
    $fUnZip = False
    $fOverwrite = True

    aber ich glaub das script kann keine ordner packen, sondern nur einzellne dateien..
    oder was mache ich falsch?

  • also das mit dem zippen funktioniert leider nicht
    du hast geschrieben:

    $zip = '7z a -tzip ' ; Pfad zu 7zip

    das ist doch kein pfad.. oder muss ich ihn anpassen
    wenn ja wie oder an was? an die 7z.exe?

  • leider nicht AutoBert,

    da dieses script nur einzelne dateien packen kann und nicht wie ich es benötige einen ganzen ordner
    oder sehe ich das falsch?