Frage zu DirMove

  • Hallo zusammen,

    wie schon oben erwähnt habe ich eine Frage zu DirMove.

    Ich hoffe Ihr könnt mir da weiterhelfen.

    Wenn ich bei bei FileMove Dateien verschiebe, die ein bestimmtes Wort enthalten, funktioniert das. Hier ein Beispiel:
    FileMove($INI_READ_SECTION_4_Data & "\" & $READ_Inputbox_Teilsystemname_hinzufuegen & "\Zeichnungen-PDF" & "\*persp*", $INI_READ_SECTION_4_Data & "\" & $READ_Inputbox_Teilsystemname_hinzufuegen & "\Baugruppenperspektive")

    Hier, bei FIleMove, mit "\*persp*".


    Wenn ich das gleiche aber mit DirMove mache:
    DirMove($INI_READ_SECTION_3_Data & "\*nc*", $INI_READ_SECTION_4_Data & "\" & $READ_Inputbox_Teilsystemname_hinzufuegen & "\NC-Daten")

    Hier mit "\*nc*" im Ordnernamen, passiert leider nichts. Die Ordner, die ich verschieben möchte, bleiben dort wo sie sind. Schade eigentlich.

    Also, wie kann ich Ordner verschieben, die in bestimmtes Wort enthalten?
    Muss ich den Ordnernamen in einen String splitten? Stehe grad voll auf´m Schlauch.

    Danke schon mal im Voraus. :)

    Gruß Mikki

    Probleme kann man niemals mit derselben Denkweise lösen, durch die sie entstanden sind.

  • Hallo @Mikki !

    In der Hilfe zu FileMove steht bei Quelle und Ziel auch : (* Wildcards werden unterstützt)
    Bei DirMove steht das nicht, hier werden vollständige Pfade erwartet.

    Um eine entsprechende Prüfung kommst Du wohl nicht herum, also :
    - der relevante Teilstring des Pfades (der Teil hinter dem letzten \) ist ein Ordner (keine Datei)

    - der Teilstring erfüllt dein Suchmuster

    Du kannst die Treffer z.B. in ein Array schreiben, und die Elemente in einer Schleife mit DirMove abarbeiten (es geht aber auch ohne Array).

    Leider habe ich gerade kein passendes Beispiel parat und bin sehr beschäftigt .
    Alternativ könntest Du Dir ggf. mal das Windowstools XCOPY bzgl. Wildcards ansehen - ist aber nicht gerade mein Favorit. Eine native Lösung in AutoIt bringt Dir wahrscheinlich mehr.

    Edit : Hier einige Stichworte, die Dich ggf. in die richtige Richtung lenken ^^
    FileFindFirstFile -> erzeugt ein Handle (siehe Beispiel in der Hilfe)
    Dann mit FileFindNextFile() das Verzeichnis durchsuchen.
    Dort kannst Du mit If @extended Then... die Suche auf Ordner einschränken.
    Allerdings erlaubt FileFindNextFile lt. Hilfe nur eine Wildcard je Filename und Extension. Du möchtest aber zwei ("\*nc*").

    Auch einen Blick wert : _FileListToArrayRec

    Gruß Musashi

    86598-musashi-c64-png

    "Am Anfang wurde das Universum erschaffen. Das machte viele Leute sehr wütend und wurde allenthalben als Schritt in die falsche Richtung angesehen."

    2 Mal editiert, zuletzt von Musashi (24. August 2017 um 17:04) aus folgendem Grund: Antwort erweitert

  • Hallo @Musashi

    ja okay das mit der Wildcard habe ich verstanden.

    Gut danke für die Tipps. :) Ich werde sie morgen direkt mal ausprobieren ;)

    Gruß Mikki

    Probleme kann man niemals mit derselben Denkweise lösen, durch die sie entstanden sind.

  • Hi @Mikki !

    Hier mit "\*nc*" im Ordnernamen, passiert leider nichts. Die Ordner, die ich verschieben möchte, bleiben dort wo sie sind. Schade eigentlich.
    Also, wie kann ich Ordner verschieben, die in bestimmtes Wort enthalten?

    Da der Ordnername eine Wildcard VOR und HINTER dem Teilnamen (hier nc) enthält, ist wahrscheinlich die Prüfung über einen regulären Ausdruck sinnvoll. Da reguläre Ausdrücke (RegExp) nicht trivial sind, habe ich Dir mal ein Beispielskript gebaut.

    Ich denke, das sollte Dir weiterhelfen ;) .

    Nebenbei :
    Falls Du dich für reguläre Ausdrücke interessiert, es gibt ein super Tutorial von SEuBo unter :
    https://autoit.de/index.php/Thread/19071-StringRegExp-Tutorial-Reguläre-Ausdrücke-in-AutoIt/

    Gruß Musashi

    86598-musashi-c64-png

    "Am Anfang wurde das Universum erschaffen. Das machte viele Leute sehr wütend und wurde allenthalben als Schritt in die falsche Richtung angesehen."

    Einmal editiert, zuletzt von Musashi (25. August 2017 um 06:38)

  • Hallo @Musashi

    Danke für deine Antwort. Wenn ich mir den diesen Code kopiere und und bei $sSourceDir den Pfad einsetze, findet er die Ordner. Das schreibt er auch in der Konsole.

    Setze ich aber anstelle den Pfad eine Variable ein, die aus einer .ini-Datei liest, passiert nichts. Es kommt aber auch keine Fehlermeldung.

    Hier mal das Beispiel:


    Die Variablen sind am Anfang mit Global deklariert.

    Gruß Mikki

    Probleme kann man niemals mit derselben Denkweise lösen, durch die sie entstanden sind.

  • Hallo alpines,

    der Schlüssel liegt hier:

    [3.Quellverzeichnis NC-Daten]
    Quelle-nc-daten=C:\Users\mikki\Desktop\test

    Ich spreche den Schlüssel an: $INI_READ_SECTION_3_Data = IniRead($sFileOpenDialog_Auftrag, $SECTION_3_Data, "Quelle-nc-daten", "Error") -> "Quelle-nc-daten"

    Probleme kann man niemals mit derselben Denkweise lösen, durch die sie entstanden sind.

  • Ja steht es.

    Hier ein Auszug:


    Die Sektion ist immer die gleiche. Deshalb habe ich sie Global am Anfang als "Standard" gesetzt. Der Schlüssel heißt auch immer gleich.
    Deshalb kann ein Schreibfehler in der Variable eigentlich nicht in Frage kommen.

    Sorry verstehe ich gerade nicht. Wie meinst du das jetzt alle Variablen ausgeben lassen? Bin noch Anfänger^^

    Gruß

    Probleme kann man niemals mit derselben Denkweise lösen, durch die sie entstanden sind.

  • Hallo @Mikki !

    Erstmal : Dieser Teil in der While-Loop

    DirCopy($INI_READ_SECTION_3_Data & "\*nc*", $INI_READ_SECTION_9_Data)

    sieht seltsam aus. (Nebenbei : Wenn Du Code einfügst, benutze bitte die Syntax-Hervorhebung für AutoIt, sonst kann man das schlecht lesen)

    Statt & "\*nc*" sollte da & "\" & $sEntryName stehen, also dem Treffer des regulären Ausdruckes.

    Zudem hast Du die Prüfung If @extended Then ... herausgenommen (prüft, ob Treffer ein Verzeichnis ist).
    Die ist (wg. DirCopy) aber wichtig, da der reguläre Ausdruck StringRegExp($sEntryName,"(?i)^(.*)nc(.*)$") auch auf Dateien zutreffen kann.

    Das Ergebnis der IniRead-Funktion und die sFileOpenDialog_Auftrag Variable sollst du dir ausgeben lassen (MsgBox, Konsole) damit du sehen kannst ob du dort Fehler hast, poste die mal hier.

    Sehe ich auch so, dass in den IniReads etc. möglicherweise ein Fehler steckt !

    Gruß Musashi

    86598-musashi-c64-png

    "Am Anfang wurde das Universum erschaffen. Das machte viele Leute sehr wütend und wurde allenthalben als Schritt in die falsche Richtung angesehen."

    3 Mal editiert, zuletzt von Musashi (28. August 2017 um 16:05) aus folgendem Grund: Antwort ergänzt

  • Hallo,

    ich hoffe mal das ist jetzt richtig so:

    @@ Debug(403) : $INI_READ_SECTION_1_Data = C:\Users\mikki\Desktop\umw
    >Error code: 0
    @@ Debug(405) : $INI_READ_SECTION_2_Data = C:\Users\mikkir\Desktop\test\lists
    >Error code: 0
    @@ Debug(407) : $INI_READ_SECTION_3_Data = C:\Users\mikki\Desktop\test
    >Error code: 0
    @@ Debug(410) : $INI_READ_SECTION_4_Data = C:\Users\mikki\Desktop\test\lieferungen
    >Error code: 0
    @@ Debug(413) : $INI_READ_SECTION_5_Data = C:\Users\mikki\Desktop\test\plaene
    >Error code: 0
    @@ Debug(416) : $INI_READ_SECTION_6_Data = C:\Users\mikki\Desktop\Server\21 - Werkstattzeichnungen\Stücklisten
    >Error code: 0
    @@ Debug(418) : $INI_READ_SECTION_7_Data_1 = C:\Users\mikki\Desktop\Server\21 - Werkstattzeichnungen
    >Error code: 0
    @@ Debug(420) : $INI_READ_SECTION_7_Data_2 = C:\Users\mikki\Desktop\Server\21 - Werkstattzeichnungen\dwg
    >Error code: 0
    @@ Debug(422) : $INI_READ_SECTION_7_Data_3 = C:\Users\mikki\Desktop\Server\21 - Werkstattzeichnungen\bmf
    >Error code: 0
    @@ Debug(424) : $INI_READ_SECTION_8_Data_1 = C:\Users\mikki\Desktop\Server\29 - Stahlbau Sonstiges
    >Error code: 0
    @@ Debug(426) : $INI_READ_SECTION_8_Data_2 = C:\Users\mikki\Desktop\Server\29 - Stahlbau Sonstiges\dwg
    >Error code: 0
    @@ Debug(428) : $INI_READ_SECTION_8_Data_3 = C:\Users\mikki\Desktop\Server\29 - Stahlbau Sonstiges\bmf
    >Error code: 0
    @@ Debug(430) : $INI_READ_SECTION_9_Data = C:\Users\mikki\Desktop\Server\21 - Werkstattzeichnungen\NC-Daten
    >Error code: 0
    Qt: Untested Windows version 10.0 detected!
    @@ Debug(535) : DirCopy($INI_READ_SECTION_3_Data & "\" & $sEntryName, $INI_READ_SECTION_9_Data) = 0
    >Error code: 0
    @@ Debug(535) : DirCopy($INI_READ_SECTION_3_Data & "\" & $sEntryName, $INI_READ_SECTION_9_Data) = 0
    >Error code: 0

    Probleme kann man niemals mit derselben Denkweise lösen, durch die sie entstanden sind.

  • Hallo @Mikki !

    DirCopy($INI_READ_SECTION_3_Data & "\" & $sEntryName, $INI_READ_SECTION_9_Data) = 0

    Du kannst, wie @alpines angeregt hat, z.B. das optionale Flag 'Overwrite' verwenden, also : DirCopy($INI_READ_SECTION_3_Data & "\" & $sEntryName, $INI_READ_SECTION_9_Data,1)
    Eventuell solltest Du die Verzeichnis- und Dateinamen auch in " " setzen, falls sie Leerzeichen enthalten.
    usw.

    Allgemein :
    Ich würde Dir aber folgende, allgemein bewährte, Vorgehensweise empfehlen.
    Erstelle ein kleines Testprogramm, welches die einzelnen Schritte anhand einer einfachen Struktur abbildet, ohne den ganzen Overhead und den langen Variablenbezeichnungen. Die Verzeichnisse solltest Du auch einfach halten, also z.B. :
    - Quellverzeichnis = @Skriptdir (dort einige Unterverzeichnisse zum Testen anlegen)
    (hier auch die .Ini-Datei mit einer Sektion und einem Key/Value)
    - Zielverzeichnis z.B. = c:\temp\dirmovetest

    Damit läßt sich leichter analysieren, wo potenzielle Fehler stecken. Zudem haben dann alle hier einen vollständigen, lauffähigen Code, den man ohne Aufwand testen kann.

    Gruß Musashi

    86598-musashi-c64-png

    "Am Anfang wurde das Universum erschaffen. Das machte viele Leute sehr wütend und wurde allenthalben als Schritt in die falsche Richtung angesehen."

  • Das ist nur bei der Shellaufrufen und deren Parametern notwendig. Tatäschlich kann man mit den prebuilt AutoItfunktionen auch ohne Extra-Stringliterale auskommen.

    Stimmt - sorry.
    Bin gerade in einem Projekt, wo viele, sehr parameterlastige, Run/RunWait etc. Aufrufe gemacht werden.
    Daher habe ich vor lauter Anführungszeichenverkettungen wohl momentan einen Tunnelblick ^^ .

    Gruß Musashi

    86598-musashi-c64-png

    "Am Anfang wurde das Universum erschaffen. Das machte viele Leute sehr wütend und wurde allenthalben als Schritt in die falsche Richtung angesehen."

  • Abend zusammen,

    habe den kompletten Code auf der Arbeit. Ich werde morgen früh eine abgespeckte Version basteln, die nur auf das Problem fixiert ist, damit es für euch und für mich leichter ist.

    Aber trotzdem schon mal Danke für die Mühen :)

    Bis dahin.

    Gruß Mikki

    Probleme kann man niemals mit derselben Denkweise lösen, durch die sie entstanden sind.

  • Guten Morgen zusammen,


    also hier der Code:


    Die Ordner heißen z.B. ncblech-ts700 und ncprofil-ts700.

    Der Order mit Inhalt soll von einem Ort zum anderen kopiert werden.

    Im nächsten Schritt dann in den angegebenen Pfad verschoben werden.

    Gruß Mikki

    Probleme kann man niemals mit derselben Denkweise lösen, durch die sie entstanden sind.

  • Hallo @Mikki !
    Ich habe nur kurz quergelesen (bin momentan wieder etwas knapp mit Zeit) ^^

    Hier die ersten Eindrücke (keine Fehleranalyse) !
    Mir ist, offen gesagt, noch nicht so recht klar, wo Du eigentlich hin willst.

    So wie ich Dich verstanden habe, möchtest Du folgendes erreichen :
    In einem Quellverzeichnis, z.B. c:\Mikki\Auftraege\ befinden sich Subdirs z.B. \ncblech-ts700.
    Die .ini-Datei befindet sich im Quellverzeichnis c:\Mikki\Auftraege und enthält u.A. die verschiedenen Pfade. Wie schon vermutet, wird die .ini-Datei mit einer Doppelextension, also z.B. Auftrag.ini.ini, angelegt. Brauchst Du für jeden Vorgang eine eigene .ini-Datei, oder warum tauchen immer die FileDialoge auf ?
    Die Unterverzeichnisse sollen durchsucht werden, und falls ein Ordnername ein bestimmtes Namensmuster (z.B. \*nc*) enthält, wird dieser Ordner verschoben/kopiert.

    Der Order mit Inhalt soll von einem Ort zum anderen kopiert werden.
    Im nächsten Schritt dann in den angegebenen Pfad verschoben werden.

    Kopierst Du von A nach B, und verschiebst dann von B nach C, um die Dateien in A zu behalten ?
    Oder : Kopierst Du von A nach B (Sicherheitskopie), und verschiebst dann von A nach C ?

    Zu : $sFileSaveDialog_Auftrag = FileSaveDialog($sMessage, @WindowsDir & "", "Auftragsdatei (*.ini)", $FD_PATHMUSTEXIST)
    Warum wählst Du @WindowsDir als Default-Speicherort, und was soll das & "" ?
    Auf das @WindowsDir haben Normaluser keine Schreibrechte, du müsstest also #RequireAdmin setzen. Ich denke aber nicht, dass Du @WindowsDir im Regelbetrieb verwenden willst, oder ?
    Wie gesagt, alles nur erste Überlegungen/Fragen.

    Gruß Musashi

    86598-musashi-c64-png

    "Am Anfang wurde das Universum erschaffen. Das machte viele Leute sehr wütend und wurde allenthalben als Schritt in die falsche Richtung angesehen."