Jump to content

Powershell - Teile des Dateinamens vergleichen und neuere Datei behalten


Der letzte Beitrag zu diesem Thema ist mehr als 180 Tage alt. Bitte erstelle einen neuen Beitrag zu Deiner Anfrage!

Empfohlene Beiträge

Gute Morgen zusammen,

 

ich habe mich entschieden, mich über Lektüre in Powershell einzulesen.

Leider komme ich aktuell nicht mehr vorwärts, weil es schon an kleinsten Stellen hapert.

Da ich die Lösung relativ kurzfristig benötige, werde ich den Kopier- bzw Transferprozess der Dateien vorerst manuell durchführen müssen.

Ich habe mich auch daran versucht den Algorithmus zu beschreiben, aber selbst da hakt es stark, weil ich gar nicht weiß, was ich alles umsetzen kann.

 

Ich  bedanke mich wirklich vielmals und werde hier natürlich weiterhin meinen Fortschritt hineinschreiben.

Ich wünsche euch allen einen klasse Start in die Woche.

 

Beste Grüße

Cartis

Link zu diesem Kommentar

Moin,

 

danke für die Rückmeldung und viel Erfolg!

 

Eine Anmerkung noch:

vor einer Stunde schrieb cartis:

Ich habe mich auch daran versucht den Algorithmus zu beschreiben, aber selbst da hakt es stark, weil ich gar nicht weiß, was ich alles umsetzen kann.

dann beschreibe (für dich selbst) erst mal, was du manuell tun würdest, um die Aufgabe zu lösen. Das kann für solche Aufgaben eine gute Ausgangsbasis sein, von der aus du dich dann weiter bewegst.

 

Gruß, Nils

 

Link zu diesem Kommentar

Hallo zusammen,

 

Am 17.12.2021 um 08:38 schrieb BOfH_666:

Da Du ja nur Teile der Dateinamen vergleichen möchtest, hilft es Dir vielleicht, die Dateinamen auch in ihre "Bestandteile" zu zerlegen. Und dass die Dateinamen offenbar bereits eine Struktur haben, macht es natürlich einfacher. Du könntest also z.B. den "BaseName" jeder Datei - also den Dateinamen ohne Endung - mittels -Split '_' an den Unterstrichen auftrennen und dann mittels Group-Object schon mal ganz einfach die zusammengehörigen Dateinamen ermitteln.

 

Könnt ihr mir helfen, wie das gemeint ist?

Egal wie ich Split verwenden möchte, es scheint diese Funktion nicht zu geben. Ich wäre wirklich mehr als Dankbar.

 

Beste Grüße

Cartis

Link zu diesem Kommentar
vor 4 Minuten schrieb cartis:

Egal wie ich Split verwenden möchte, es scheint diese Funktion nicht zu geben. Ich wäre wirklich mehr als Dankbar.

 

Wenn es hier um Scripting geht und Code, ist es keine gute Idee, Sachen nur zu beschreiben. Du gehst ja auch nicht zur KFZ-Werkstatt und beschreibst das Problem, das Du mit Deinem Auto hast - Du bringst das Auto mit. ;-)  Also poste doch einfach den Code, den Du benutzt, eventuelle Fehlermeldungen, die Du bekommst und eine kurze Erklärung, was Deiner Meinung nach nicht funktioniert wie erwartet.

 

Ich hatte Dir weiter oben eine Doku verlinkt, die den Operator "-split" erklärt. Da sind auch immer Beispiele dabei. Probier ruhig das ein oder andere und "spiel ein bissl rum" mit den Befehlen. Man lernt eine komplexe Technologie wie PowerShell nicht in 2 Stunden. ;-)

'Das_hier_ist_ein_Beispiel' -split '_'

 

Link zu diesem Kommentar

Hallo ;)

 

Also vorab möchte ich sagen, dass ich aus der Formatierung und Layoutanleitung noch nicht so ganz schlau geworden bin bzw. ich weiß noch nich so genau wie ich das logisch umsetzen sollte, aber ich gebe mir viel Mühe, es etwas lesbarer zu gestalten.

Bisher habe ich folgendes erreicht:

 

$source="C:\Test\Dokumenten_Container";     $destination="C:\Test\Aufteilung\AF"

$filter=("*_AF0*.pdf");                     $Name = Get-ChildItem ($source) -filter ($filter)


($Name) -split '_' |

Group-Object

 

 

Liefert als Ergebnis folgende Information:

 

Count Name                      Group                                                                                                                                                              
----- ----                      -----                                                                                                                                                              
    5 UDE                       {UDE, UDE, UDE, UDE...}                                                                                 
    5 Q                         {Q, Q, Q, Q...}                                                                                         
    5 AF0001                    {AF0001, AF0001, AF0001, AF0001...}                                                                     
    1 Chargenreinheit           {Chargenreinheit}                                                                                       
    2 00.pdf                    {00.pdf, 00.pdf}   
    4 Testdokument              {Testdokument, Testdokument, Testdokument, Testdokument}    
    1 01.pdf                    {01.pdf}                              
    1 02.pdf                    {02.pdf}                           
    1 03.pdf                    {03.pdf}

 

 

Dazu möchte ich sagen, dass ich erreichen konnte, dass das Grunddokument jetzt mit der Revisionsnummer 00 ausgetattet wird und es somit KEIN Dokument mehr ohne einer zweistelligen Revisionsnummer am Ende.

Ich habe eure Tips wirklich ausgiebig gelesen. Vielleicht verstehe ich die Ansätze noch nicht so recht, dafür möchte ich mich entschuldigen.

 

Beste Grüße

Cartis

Link zu diesem Kommentar
vor einer Stunde schrieb cartis:

Also vorab möchte ich sagen, dass ich aus der Formatierung und Layoutanleitung noch nicht so ganz schlau geworden bin

Keine Angst .... an der Stelle waren wir alle mal ... ;-)

 

vor einer Stunde schrieb cartis:

ich weiß noch nich so genau wie ich das logisch umsetzen sollte

Wie Nils schon angeregt hatte, ist es - gerade bei etwas komplexeren Aufgabenstellungen - hilfreich, wenn man sich das Ganze mal aufschreibt/visualisiert. Am bestem mit einem Ablaufdiagramm/Entscheidungsbaum

 

vor einer Stunde schrieb cartis:

Dazu möchte ich sagen, dass ich erreichen konnte, dass das Grunddokument jetzt mit der Revisionsnummer 00 ausgetattet wird

Das ist sehr praktisch.  :thumb1:

 

vor einer Stunde schrieb cartis:

Ich habe eure Tips wirklich ausgiebig gelesen. Vielleicht verstehe ich die Ansätze noch nicht so recht


Nicht immer sind die Tipps, die man bekommt, auch wirklich hilfreich. Auch wir können mal falsch liegen. Am Ende entscheidest Du, welche Hilfe Dich weiterbringt und welche Tipps zu benutzen möchtest oder nicht.

Die Möglichkeit, die Dateinamen an den Unterstrichen aufzutrennen, heißt ja nicht zwingend, dass das genau so auch hilfreich ist. In Deinem Fall willst Du ja vermutlich nur den variablen Teil abtrennen. Dafür kann man auch andere Methoden benutzen, wenn man damit besser zurechtkommt.

Ich bin jetzt mal von den im ersten Beitrag geposteten Dateinamen ausgegangen (UDE_Q_AF0001_Testdokument.docx) und davon, dass die Versionierung auch durch einen Unterstrich vom Rest des Dateinamens abgetrennt ist.

Hier mal meine Idee:

$Path = 'C:\Test\Dokumenten_Container'
$Filter = '*_AF0*.pdf'
$FileList = Get-ChildItem -Path $Path -Filter $Filter |
    Select-Object -Property *,
        @{Name = 'PartlyFileName'; Expression = {($_.BaseName -split '_')[0..3] -join '_'}}

$FileList |
    Group-Object -Property PartlyFileName

 

Das Ergebnis sollte dann ungefähr so aussehen:

Count Name                      Group
----- ----                      -----
    5 UDE_Q_AF0001_Testdokument {@{PSPath=Microsoft.PowerShell.Core\FileSystem::C:\Test\Dokumenten_Container\UDE_Q_AF0001_Testdokument_00.pdf;...
    3 UDE_Q_AF0002_Testdokument {@{PSPath=Microsoft.PowerShell.Core\FileSystem::C:\Test\Dokumenten_Container\UDE_Q_AF0002_Testdokument_02.pdf;...
    2 UDE_Q_AF0003_Testdokument {@{PSPath=Microsoft.PowerShell.Core\FileSystem::C:\Test\Dokumenten_Container\UDE_Q_AF0003_Testdokument_00.pdf;...

 

bearbeitet von BOfH_666
Link zu diesem Kommentar

Hallo BOfH_666,

 

vielen herzlichen Dank.

Es ist so ein interessantes Thema, dass ich absolut dabie bleiben werden, weit über dieses Script hinaus.

Vielen Dank für deinen Ansatz.

Jetzt versuche ich den aufzuschlüsseln und zu verstehen natürlich.

Ich habe ein ähnliches Ergebnis. Wenn ich das richtig verstehe, habe ich jetzt die Möglichkeit mit dem Ergebnis weiterzuarbeiten, oder?

Vielen Dank nochmals für den Link, ich mache mich gerade dran, zu beschreiben was ich eigentlich möchte :D

 

Beste Grüße

Cartis

 

Link zu diesem Kommentar
vor 6 Minuten schrieb cartis:

Wenn ich das richtig verstehe, habe ich jetzt die Möglichkeit mit dem Ergebnis weiterzuarbeiten, oder?

Genau. Darum geht es Dir ja schließlich. Du hast jetzt die Dateien, die sich nur in der Versionsnummer unterschieden jeweils in einer eigenen Gruppe. Von da aus kannst Du - gemäß Deinem Ablaufplan - weitermachen. ;-) 

Link zu diesem Kommentar

Guten Morgen BOfH_666, guten Morgen zusammen,

 

vielen Dank nochmals für die Hilfe.

Ich habe gefühlt das halbe Internet abgesucht um zu erfahren, was ich mit der Gruppierung jetzt alles so anfangen kann., daher verstehe ich so langsam, warum ein Ablaufplan wichtig ist.:grins2:

Es tut mir leid, dass ich hier eure Zeit raube. Bitte glaubt mir, mein Ziel war es nicht, in dieses Forum zu kommen und mit einem fertigen Code wieder rauszuspazieren.

Ich war wahrscheinlich etwas zu optimistisch, dass ich es schneller verstehen würde.;-)

 

Mal ein Gedankenansatz, was ich glaube jetzt damit anfangen zu müssen bzw. können.

Da ich jetzt eine Auflistung habe, die mir den Dateinamen ohne Revisionierung zusammenfasst, hatte ich folgende Überlegungen:

 

Jede "Gruppe" so filtern, dass nur noch die zuletzt bearbeitete Datei übrig bleibt. Anschließend diese Dateien dann auswählen und in den neuen Pfad kopieren.

Ist der Gedanke sehr abwegig? Ich weiß nicht genau ob ich da völlig auf dem Holzweg bin.

 

Beste Grüße

Cartis

 

Link zu diesem Kommentar
vor 2 Stunden schrieb cartis:

Jede "Gruppe" so filtern, dass nur noch die zuletzt bearbeitete Datei übrig bleibt. Anschließend diese Dateien dann auswählen und in den neuen Pfad kopieren.

Ist der Gedanke sehr abwegig? Ich weiß nicht genau ob ich da völlig auf dem Holzweg bin.

 

Na, Du wolltest doch die verschiedenen Versionen, abhängig von der angehängten Versionsnummer in verschiedene Ordner kopieren/verschieben, oder? Das ist jetzt die Stelle dafür. Und dafür wäre jetzt vielleicht ... 

vor 2 Stunden schrieb cartis:

ein Ablaufplan wichtig

:aetsch2: ;-)

Link zu diesem Kommentar

Supi. Sieht dufte aus.  ;-):-)  ... aber das ist ja nur die halbe Miete, oder? Wenn ich mir nochmal den gepimpten Screenshot angucke, den Du vorher gepostet hattest, willst Du ja nicht nur einen Ordner beackern, sondern 4 oder 5. Und ging es Dir bei der Prüfung der Dateien wirklich um das "Datei-Alter" oder eher um die angehängte Versionierung? Wenn es um das Alter geht, was passiert mit gleichnamigen Dateien, die aber unterschiedliche Änderungsdaten haben?  ;-)

Link zu diesem Kommentar

Guten Morgen BOfH_666,

 

ich danke dir wieder sehr für deine Nachricht.

Da ich bis spät Abends noch an der organisation der Dateien iund optimierung des vorgelagerten Prozesses gearbeitet habe, ist mir natürlich auch noch einiges aufgefallen.

Ich werde das Ablaufdiagramm nochmals anpassen.

 

Bis später und einen super Tag wünsche ich euch :)

 

 

Wie man sehen kann, gibt es kein Archiv mehr.

Ich habe mir jetzt folgende Lösung ausgedacht. Die Historie bleibt im Quellordner eh bestehen.

Für mich ist nur das Dokument mit der letzten Revisionierung interessant und da ich das Dokument im Idealfall ohne Revisionsnummer im Dateinamen benötige, wäre es super, wenn es gleich so abgespeichert wird.

Wie könnte ich soetwas umsetzen?

 

Beste Grüße

Cartis

ablaufplan.png

Link zu diesem Kommentar

Es gibt einen Dokumentenschlüssel? Diese Information ist neu. ;-) 

 

Es sieht für mich so aus, als würde es am Ende immer wieder darauf hinauslaufen, dass Du die Dateien abhängig von ihrer Namensstruktur behandeln willst.

 

Du hast also einen Ordner mit einem Haufen Dateien, die zum Teil ähnliche Namen haben und sich nur anhand der Versionsnummer unterscheiden. Diese Grüppchen sammelst Du mit der bereits erarbeiteten Logik zusammen. Wenn man das richtig macht, hat man bereits alle Infos separiert, die man für die weiteren Schritte braucht. In jeder dieser Gruppen hast Du jetzt als Elemente den Basis-Namen (den Dokumentenschlüssel arbeiten wir auch gleich mit ein) und die angehängte Versionierung. Die Angehängte Versionierung liegt aber noch nicht als "Zahl" sondern als "String" vor. Um sie zuverlässig sortieren zu können, müssen wir sie in eine Zahl wandeln und dann können wir die "Letzte" ermitteln. So hast Du die Datei ermittelt, die Du dann schließlich kopieren willst.  (Achja, ich hab mal "meinen" Test-Pfad drin gelassen - so passt die Ausgabe zum Code ;-)  )

$Path = 'D:\sample\Work'
$Filter = '*UDE_Q_*.pdf'
$FileList = 
    Get-ChildItem -Path $Path -Filter $Filter |
        Select-Object -Property *,
            @{Name = 'PartlyFileName'; Expression = { ($_.BaseName -split '_')[0..3] -join '_' } },
            @{Name = 'VersionINT'    ; Expression = { [int]($_.BaseName -split '_')[4] } },
            @{Name = 'DocumentKey'   ; Expression = { ($_.BaseName -split '_')[2] } }

$SeparatedGroupList =
    $FileList |
        Group-Object -Property PartlyFileName

 

Hiermit hast Du alles eingesammelt, was Du brauchst. Jetzt geht's ans Sortieren:

foreach ($Group in $SeparatedGroupList) {
    $Group.Group | 
        Sort-Object -Property VersionInt | 
            Select-Object -Last 1 -Property PartlyFileName, DocumentKey, VersionInt, FullName
}

Der Schnipsel ist quasi nur zur visuellen Kontrolle. Mit meinen Beispiel-Dateinamen sieht die Ausgabe so aus:

PartlyFileName            DocumentKey VersionINT FullName
--------------            ----------- ---------- --------
UDE_Q_AF0001_Testdokument AF0001               4 D:\sample\Work\UDE_Q_AF0001_Testdokument_04.pdf
UDE_Q_AF0002_Testdokument AF0002               3 D:\sample\Work\UDE_Q_AF0002_Testdokument_03.pdf
UDE_Q_AF0003_Testdokument AF0003               1 D:\sample\Work\UDE_Q_AF0003_Testdokument_01.pdf
UDE_Q_FA0001_Testdokument FA0001               2 D:\sample\Work\UDE_Q_FA0001_Testdokument_02.pdf
UDE_Q_FA0002_Testdokument FA0002               4 D:\sample\Work\UDE_Q_FA0002_Testdokument_04.pdf
UDE_Q_FA0003_Testdokument FA0003               1 D:\sample\Work\UDE_Q_FA0003_Testdokument_01.pdf

Du hast jetzt also die jeweils "letzte" Datei aus jeder Gruppe, deren kompletten Pfad, welchen Du fürs Kopieren brauchst, den PartlyFileName, welchen Du als Ziel-DateiName benutzen kannst, und den Dokumentenschlüssel, welchen Du für die Entscheidung benutzen kannst, wohin die Datei kopiert werden soll. Also statt der Ausgabe auf der Konsole, baust Du an der Stelle eine Bedingung ein, die das Kopier-Ziel anhand des Dokumentenschlüssels festlegt, baust den gewünschten Ziel-Pfad mittels Join-Path zusammen und Kopierst die Datei ans Ziel ..... fertig.

 

Wenn Du Dir das Leben sogar noch etwas einfacher machen möchtest, kannst Du die Zielpfade für die verschiedenen Dokumentenschlüssel im letzten Pfadelement quasi gleich dem Dokumentenschlüssel machen. Dann könntest Du Dir die Abfrage der Bedingung sparen und einfach den Dokumentenschlüssel als Bestandteil des Zielpfades benutzen.

bearbeitet von BOfH_666
Link zu diesem Kommentar
Der letzte Beitrag zu diesem Thema ist mehr als 180 Tage alt. Bitte erstelle einen neuen Beitrag zu Deiner Anfrage!

Schreibe einen Kommentar

Du kannst jetzt antworten und Dich später registrieren. Falls Du bereits ein Mitglied bist, logge Dich jetzt ein.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung jetzt entfernen

  Only 75 emoji are allowed.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor-Fenster leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

×
×
  • Neu erstellen...