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

Guten Morgen zusammen,

 

mein erster Post und direkt eine Frage.

ich bin durch Zufall darauf gekommen, dass ich mein Problem eventuell auch mit einem Powershell Script lösen könnte. Dazu habe ich bereits recherchiert, aber leider bin ich bei meinem Problem noch nicht wirklich weiter gekommen.

Hier die Ausgangsstellung:

In meinem Unternehmen wird ein Programm verwendet, welches Dateien in verschiedenen Revision in einen gemeinsamen Ordner schreibt. Bei den Dateiformaten handelt es sich um docx, xls und pdf dateien.

Problematisch ist der Umstand das die Revisionen nur mit einer fortlaufenden Nummer am Ende des Dateinamens versehen werden, getrennt durch einen Unterstrich vom Rest des Namens. Hier ein Bespiel.
UDE_Q_AF0001_Testdokument.docx
UDE_Q_AF0001_Testdokument_1.docx
 

Ich würde gerne folgendes Umsetzen:
Die beiden Dateinamen so miteinander vergleichen, dass die Revision nicht beachtet wird und die neuere Datei "behalten" und die alte Datei in ein Archiv verschieben.
Das Script soll mehrmals täglich durch den Windows Aufgabenplaner ausgeführt werden.

 

Ich hoffe sehr, dass ich mich nicht zu umständlich ausgedrückt habe und wünsche allen einen wunderbaren Start in den Donnerstag.

 

Beste Grüße

Cartis

Link zu diesem Kommentar

Hallo cartis,

 

willkommen an Board. Gerne können wir Dich bei Deiner Aufgabe unterstützen. Da du dich im Scripting-Bereich gemeldet hast, kann ich Dir auch gleich empfehlen mit Powershell anzufangen, statt mit irgendetwas anderem.

 

Zum Starten ist die Dokumentation vom Hersteller sehr hilfreich: Get-ChildItem (Microsoft.PowerShell.Management) - PowerShell | Microsoft Docs

Get-ChildItem

 

Hast du denn schon allgemein Erfahrungen mit Powershell?

Link zu diesem Kommentar

Hallo Jan,

 

vielen Dank für deine Antwort.

Oh die Dokumentation war mir nicht bekannt, da werde ich direkt einarbeiten, vielen Dank.

Ich habe bisher ein Script genau mit dem Befehl umgesetzt.

Dabei werden alle PDF Dateien eines Ordners in verschiedene Ordner zur weiterverarbeitung und archivierung sowie backup (Dieses Redundanz war nicht meine Idee :) ) verteilt bzw. verschoben und kopiert.

 

Beste Grüße

Cartis

Link zu diesem Kommentar

Moin,

 

ich nehme mal an, dass du hiermit:

vor 56 Minuten schrieb cartis:

Die beiden Dateinamen so miteinander vergleichen, dass die Revision nicht beachtet wird

in Wirklichkeit meinst, dass die Revision sehr wohl beachtet wird, nur eben im Zusammenhang mit dem "eigentlichen" Dateinamen? Der Logik nach, die du beschreibst, hieße 

vor 57 Minuten schrieb cartis:

die neuere Datei "behalten"

ja, dass die mit der höchsten Nummer bleiben soll, alle mit geringeren Nummern verschwinden ins Archiv. Oder?

 

Mit solchen Überlegungen näherst du dich dann dem Algorithmus an, den ein Skript umsetzen würde. Weitere Fragen wären z.B. ob die Nummern am Ende wirklich immer Revisionen sind (oder ob der "Rohname" einer Datei vielleicht auch schon _12 oder so am Ende haben kann), wie oft es neue Revisionen gibt (du schreibst "die beiden Dateinamen" - es können doch aber sicher auch mehr als zwei gleichzeitig da sein) usw.

 

Gruß, Nils

 

Link zu diesem Kommentar

Hallo Jan,

 

vielen Dank erneut für deine Antwort.

Ich werde mich auch da einarbeiten. Sieht nach einem sehr interessantem Thema aus.

 

Hallo Nils,

 

auch dir vielen Dank, du hast natürlich recht. Ich habe vielleicht twas zu sehr um die Ecke gedacht.

Es kann durchaus vorkommen, dass der Dateiname mit "_xx" endet obwohl es die erste Version ist, also keine Revision. Das habe ich nicht bedacht.

 

Ja es gibt nachdem ich mich dort jetzt etwas eingelesen habe doch noch etwas, was ich zu der Problemstellung noch erwähnen muss.

Die Dateien dürfen NICHT verschoben werden bzw. aus dem Quellverzeichnis gelöscht werden, weil die Historie dort gespeichert bleiben muss.

Wichtig wäre also Das die Quelldateien unberührt bleiben und nur die Zieldateien ersetzt werden.

Es kann durchaus vorkommen das es Revisionsstände im 3stelligen Bereich geben kann. Zum Revisionsintervall kann ich leider nichts genaues sagen.

Wäre es dennoch möglich mit Powershell zu realisieren?

 

Beste Grüße

Cartis

Link zu diesem Kommentar
vor 12 Minuten schrieb cartis:

Wichtig wäre also Das die Quelldateien unberührt bleiben und nur die Zieldateien ersetzt werden.

 

Hmmm ... läuft das nicht auf ein einfaches Backup hinaus? Wenn Du die Quelldateien nicht "ausdünnen" darfst, macht es vermutlich auch keinen Sinn, weniger als den aktuellen Status zu sichern, oder?

vor 15 Minuten schrieb cartis:

Wäre es dennoch möglich mit Powershell zu realisieren?

 

Vermutlich schon ... solange Du klar formulieren kanns, was genau Du möchtest, kann man es vermutlich in Code umsetzen.

Link zu diesem Kommentar

Moin,

 

vor 22 Minuten schrieb cartis:

Die Dateien dürfen NICHT verschoben werden bzw. aus dem Quellverzeichnis gelöscht werden, weil die Historie dort gespeichert bleiben muss.

Wichtig wäre also Das die Quelldateien unberührt bleiben und nur die Zieldateien ersetzt werden.

ich habe keine Vorstellung, was das heißen soll. Das müsstest du alles bitte noch mal in Ruhe beschreiben, wenn wir dir helfen sollen.

 

Gruß, Nils

 

Link zu diesem Kommentar

Hallo zusammen,

 

anbei findet ihr eine Grafik.
Gerade fällt es mir schwer, die Situation richtig zu beschreiben, deswegen habe ich das mal Testweise aufgebaut.
[1] Neuste Version des Dokuments "FA0001"(Beispielhaft, der Vorgang soll ja auch mit Dokument FA0002 etc. identisch sein) im Ordner Dokumenten Container ermitteln und überprüfen diese Revision bereits im Ordner Aufteilung/FA vorhanden ist. In diesem Fall nicht. Dokument koppieren.

[2] Alte Revision in den Ordner Archiv/FA verschieben.

Punkt 3 und 4 wären identisch, nur das es sich dabei nicht um ein FA sondern um eine AF handelt.

Ich hoffe wirklich sehr, dass es etwas klarer wird.

 

Beste Grüße

Cartis

2021-12-16 11_58_22-FA.png

Link zu diesem Kommentar
vor 5 Minuten schrieb cartis:

Oder habe ich die Frage falsch verstanden.

Nein. Genau das meinte ich. :thumb1:
 

Den ersten Lesestoff hat Dir Jan weiter oben ja bereits genannt. 

 

Weiter hilfreich ist dann bestimmt auch noch das hier:

 

about_Split

 

about_If

 

about_Switch

 

everything_about_Switch

 

... ich freu mich schon auf Deinen ersten Code. ;-) 

 

 

Link zu diesem Kommentar

Guten Morgen zusammen,

 

ich habe leider nicht sooo viel Zeit aufwenden können, wie ich gerne hätte aber dennoch etwas experimentiert und bisher folgendes erreicht.

 

$source="C:\Test\Dokumenten_Container"
$destination="C:\Test\Aufteilung\AF";
$filter=("*_AF0*.pdf")
Get-ChildItem -recurse ($source) -filter ($filter) | Sort-Object LastAccessTime -Descending | Select-Object -First 1 | Copy-Item -Destination ($destination)

 

Schön ist, dass ich mit jedem Schritt den ich erreicht habe, mehr verstehe, dass ich auf dem Holzweg bin :D

Ich habe natürlich verstanden, dass "Sort-Object LastAccessTime -Descending | Select-Object -First 1" mich nicht zum gewünschten Erfolg führen wird.

Jetzt suche ich nach einer Möglichkeit die Dateinamen zu vergleichen und dennoch zu berücksichtigen, welche Datei die neuste ist.

Ich melde mich bei Fortschritt, freue mich aber natürlich dennoch über Tatkräftige Unterstützung.

 

Beste Grüße

Cartis

Link zu diesem Kommentar

Vielleicht für den Anfang noch ein ganz allgemeiner Tipp:  Du machst Dir und anderen das Leben leichter, wenn Du Deinen Code leicht lesbar schreibst. Dazu gehört unter anderem das ein oder andere Leerzeichen zwischen Variablen, Operatoren und Werten, Parameternamen möglichst explizit anzugeben, "sprechende" Variablennamen, Zeilenumbrüche, wo sie die Lesbarkeit erhöhen und Einrückungen. Hier nochmal ein bissl was zum Nachlesen:

 

The PowerShell Best Practices and Style Guide

 

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.

 

Eventuell hilfreich für Deine Aufgabe könnten auch noch calculated Properties sein. Damit kannst Du Objekten Eigenschaften hinzufügen, die sie noch nicht von selbst haben .... about_Calculated_Properties.

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...