suyalus
Goto Top

Höchste Version von Dateien in anderes Verzeichnis kopieren

Hallo Leute,

ich arbeite bei einer Behörde im Bereich des standardisierten Datenaustauschs über Schnittstellen. Ich bin jedoch kein Techniker, sondern gehöre dem fachlichen Team an. Wir legen fest, welche Inhalte in Codelisten (XML) übertragen werden.

Diese Codelisten werden regelmäßig aktualisiert und dadurch versioniert (im Dateinamen und auch in der XML als Element). Für unsere Kunden müssen wir öfters die aktuellste Version jeder Codeliste zusammenstellen und ausliefern. Mittlerweile haben wir jedoch hunderte Codelisten mit jeweils mehreren Versionen, sodass da einige Dateien zusammengekommen sind face-smile Diese liegen momentan alle in einem Windows-Ordner auf einem Laufwerk. Unsere IT-ler wollen irgendwann eine Software dafür programmieren, aber für die Zeit bis dahin wäre ein kleines Tool völlig ausreichend.

Die Namensgebung dieser Dateien ist beispielsweise:

101-v1.0.xml
101-v1.1.xml
101-v1.2.xml
102-v1.0.xml
102-v1.1.xml
103-v1.0.xml
104-v1.0.xml
104-v1.1.xml
etc.

Bevor ich händisch immer die jeweils höchste (aktuellste) Version einer Codeliste raussuchen muss (fehleranfällig), habe ich mich gefragt, ob es nicht irgendwie möglich wäre, dies automatisiert erledigen zu lassen und die Dateien in ein neues Verzeichnis zu kopieren (beim Beispiel wären dies 101-v1.2.xml, 102-v1.1.xml, 103-v1.0.xml, 104-v1.1.xml).

Ich habe schon danach gegoogelt, bin jedoch immer noch auf das Kopieren von der aktuellsten Datei nach Änderungsdatum gestoßen. Das funktioniert bei uns nicht, da über das Änderungsdatum der Datei keine Aussage über die höchste Version möglich ist.

Wäre es mit einer Batch-Datei zu lösen? Oder mit Powershell? Oder gar nicht möglich mit Windows Standardfunktionen (ich kann nicht jede Software installieren wegen internem Firmen-Windows)?
Unterscheidbar wären die Versionen anhand des Namens der Datei ("-v1.0"), dem Element Version in der XML ("V1.0") oder dem Element Datum in der XML ("YYYY-MM-DD").

Für Ideen wäre ich sehr dankbar face-smile

MfG
Suyalus

Content-Key: 438948

Url: https://administrator.de/contentid/438948

Printed on: June 16, 2024 at 20:06 o'clock

Mitglied: 139374
139374 Apr 10, 2019 updated at 13:53:59 (UTC)
Goto Top
Oder mit Powershell?
Bitteschön:
gci 'D:\Quelle' -Filter *.xml -File | sort {[int]($_.Basename -replace '[^\d]','')} -Desc | group {$_.Basename.split('-')} | %{$_.Group | select -First 1 | copy-item -Destination 'D:\Ziel'}  
Member: Suyalus
Suyalus Apr 10, 2019 updated at 13:57:06 (UTC)
Goto Top
Zitat von @139374:

Oder mit Powershell?
> gci 'D:\Quelle' -Filter *.xml -File | sort {[int]($_.Basename -replace '[^\d]','')} -Desc | group {$_.Basename.split('-')} | %{$_.Group | select -First 1 | copy-item -Destination 'D:\Ziel'}  
> 

Hi,
vielen Dank für die schnelle Antwort. Ich habe den Befehl ausprobiert und folgende Fehlermeldung erhalten:
Die Datei "XXX.ps1" kann nicht geladen werden, da die Ausführung von Skripts auf diesem System deaktiviert ist.  

Habe gelesen, dass man mit Adminrechten irgendwelche Signaturen erlauben muss, was ich hier auf meinem Client-Windows mit beschränkten Rechten niemals machen dürfte face-sad

Wäre eine ähnliche Funktion mit Batch möglich?
Mitglied: 139374
139374 Apr 10, 2019 updated at 14:10:03 (UTC)
Goto Top
Zitat von @Suyalus:
vielen Dank für die schnelle Antwort. Ich habe den Befehl ausprobiert und folgende Fehlermeldung erhalten:
Die Datei "XXX.ps1" kann nicht geladen werden, da die Ausführung von Skripts auf diesem System deaktiviert ist.  
Powershell Anfänger hier lesen!
https://www.windowspro.de/andreas-kroschel/powershell-executionpolicy-se ...
Wäre eine ähnliche Funktion mit Batch möglich?
Ja, kannst du so unter Umgehung der Policy direkt in die Batch schreiben:
@echo off
powershell -Executionpolicy ByPass -NoP -Command "gci 'D:\Quelle' -Filter *.xml -File | sort {[int]($_.Basename -replace '[^\d]','')} -Desc | group {$_.Basename.split('-')} | %%{$_.Group | select -First 1 | copy-item -Destination 'D:\Ziel'}"  
Member: Suyalus
Suyalus Apr 10, 2019 at 14:59:47 (UTC)
Goto Top
Wenn ich das mit der Batch starte, erhalte ich folgende Fehlermeldung (habe ich auch bei der Powershell erhalten, als ich die ganze Zeile händisch abgetippt habe):

Get-ChildItem: Es wurde kein Parameter gefunden, der dem Parameternamen "File" entspricht. Zeile 1, Zeichen 36.  


Weiterhin komme ich mit der Powershell-Anleitung nicht weiter. "Get-ChildItem ..." gibt mir nicht den erwarteten Return wie im Screenshot und "Set-AuthenticodeSignature ..." bringt auch nur Fehlermeldungen :P
Mitglied: 139374
139374 Apr 10, 2019 updated at 15:00:51 (UTC)
Goto Top
Es wurde kein Parameter gefunden, der dem Parameternamen "File" entspricht
Deine Powershell ist zu alt. < 3.0
Mitglied: 139374
139374 Apr 10, 2019 updated at 15:03:44 (UTC)
Goto Top
Kann man aber umschreiben dann gehts auch in einer PS 2.0 ohne den Parameter -File den es dort eben nicht gibt!
@echo off
powershell -Executionpolicy ByPass -NoP -Command "gci 'D:\Quelle' -Filter *.xml | ?{!$_.PSIsContainer} | sort {[int]($_.Basename -replace '[^\d]','')} -Desc | group {$_.Basename.split('-')} | %%{$_.Group | select -First 1 | copy-item -Destination 'D:\Ziel'}"  

bringt auch nur Fehlermeldungen :P
Das Hauptproblem ist das du eben noch zu wenig Ahnung von Powershell hast. Arbeite dich ein dann wirst du irgendwann verstehen das es geht.
Mitglied: 138701
138701 Apr 10, 2019 at 20:54:53 (UTC)
Goto Top
Eigentlich brauchst du gar kein Powershell.
Es ist ein simples Batch Script zum sortieren von Dateien.

Wichtig wären mir jedoch noch die Informationen, ob:

-alle Dateien so aufgebaut sind wie in deinem Beispiel:
XXX-v.X.X.xml
-Die Versionen befinden sich alle in 1.X oder sogar in 4.1.6

LG Ileies
Member: Suyalus
Suyalus Apr 11, 2019 updated at 06:08:19 (UTC)
Goto Top
Zitat von @139374:

Kann man aber umschreiben dann gehts auch in einer PS 2.0 ohne den Parameter -File den es dort eben nicht gibt!
> @echo off
> powershell -Executionpolicy ByPass -NoP -Command "gci 'D:\Quelle' -Filter *.xml | ?{!$_.PSIsContainer} | sort {[int]($_.Basename -replace '[^\d]','')} -Desc | group {$_.Basename.split('-')} | %%{$_.Group | select -First 1 | copy-item -Destination 'D:\Ziel'}"  
> 

Das hat funktioniert! face-smile Vielen Dank! Das erspart mir einiges an Arbeit face-smile


Edit:
(auch für Ileies)

Ich sehe gerade, dass ich ich noch etwas vergessen habe zu erwähnen:
Nicht alle Dateien heißen "101-v1.0.xml". Wir haben zu einigen Codelisten zugehörige Struktur-XMLs, die die Codeliste hierarchisch strukturieren. Diese haben im Dateinamen zusätzlich noch ein "-struktur". Beispiel:

101-v1.0.xml
101-v1.0-struktur.xml
101-v1.1.xml
101-v1.1-struktur.xml

Mit dem obigen Code kopiert er nur "101-v1.1-struktur.xml", die dazugehörige "101-v1.1.xml" nicht.

Falls einer von euch noch Lust hat, dieses Problemchen zu lösen face-smile Ansonsten hilft mir der Code wirklich weiter, damit erspare ich mir 95% der Arbeit und muss nur noch wenige Dateien aufgrund der Struktur nachziehen.

@ileies: alle Dateien haben zur Versionsangabe nur "vX.X.xml". Kein "vX.X.X.xml" (bisher).
Mitglied: 139374
Solution 139374 Apr 11, 2019 updated at 07:42:44 (UTC)
Goto Top
@echo off
powershell -Executionpolicy ByPass -NoP -Command "gci 'D:\Quelle' -Filter *.xml | ?{!$_.PSIsContainer} | sort {[int]($_.Basename -replace '[^\d]','')} -Desc | group {$_.Basename.split('-')} | %%{$_.Group | select -First 1 | copy-item -Destination 'D:\Ziel'; if($_.Group.Count -gt 1 -and $_.Group.Basename -like '*-struktur'){copy-item $_.Group[1].Fullname -Destination 'd:\ziel'}}"  
Wenns das nun endlich war auch noch entsprechend markieren. Danke.