morph163
Goto Top

Unterordner eine Ebene hoch kopieren

Hallo,
ich bin wieder auf der Suche nach einer cmd Lösung für folgende Situation:
Ich habe logfiles die gespeichert werden, das Logfile für den 01.Januar wir im Ordner 0101 abgelegt, das logfile für den 15. Januar im Ordner 1501 usw.
In den Datumsordnern sind teilweise auch noch Unterordner.
Ich will also dass der Inhalt von
c:\log\0101
c:\log\0201
usw einfach in
c:\log kopiert wird. So kompliziert kann das ja eigentlich nicht so aber mit xcopy hab ich das bisher nicht hinbekommen und mit move ebenfalls nicht. Ich befürchte ich übersehe einen wichtigen Punkt.
Ich hoffe ihr könnt mir helfen.
Vielen Dank vorab.

Content-ID: 7621899365

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

Printed on: December 7, 2024 at 18:12 o'clock

7426148943
7426148943 Jun 22, 2023, updated at Jun 23, 2023 at 08:13:50 (UTC)
Goto Top
In den Datumsordnern sind teilweise auch noch Unterordner.
Und die Unterordner der Datumsordner willst du auch mit hoch kopieren?
Wenn ja dann folgender PowerShell Einzeiler
Get-ChildItem "c:\log" -Directory | %{copy-item "$($_.Fullname)\*" -Destination $_.Parent.Fullname -Recurse}  
Wenn nein dann dieser
Get-ChildItem "c:\log\*\*" -File | copy-item -Destination {$_.Directory.Parent.Fullname}  
Wenns unbedingt noch Batch sein muss
@echo off
set "root=C:\logs"  
for /d %%a in ("%root%\*") do xcopy "%%a\*" "%root%" /e  
Funktioniert natürlich nur wenn die Dateinamen aus allen Ordnern eindeutig sind, ansonsten muss man sie nach gewünschtem Schema mit Prefix oder Suffix bei Dubletten umbenennen.

Zeppel
morph163
morph163 Jun 22, 2023 updated at 22:21:17 (UTC)
Goto Top
Hallo Zeppel,
danke für deine schnelle Antwort. Ich bekomme aber den Fehler:

Get-ChildItem : Es wurde kein Parameter gefunden, der dem Parameternamen "Directory" entspricht.
bzw.

Get-ChildItem : Es wurde kein Parameter gefunden, der dem Parameternamen "File" entspricht.
7426148943
Solution 7426148943 Jun 22, 2023 updated at 22:30:28 (UTC)
Goto Top
Deine PowerShell ist vieeeeeeeel zu alt, aktualisiere sie . Denn dort kennt sie die Parameter -File und -Directory noch nicht.

Für PowerShell 2.0 kann man es aber so umschreiben wenn man muss
Das erste
Get-ChildItem "c:\log" | ?{$_.PSIsContainer} | %{copy-item "$($_.Fullname)\*" -Destination $_.Parent.Fullname -Recurse}  
Das zweite
Get-ChildItem "c:\log\*\*" | ?{!$_.PSIsContainer} | %{copy-item $_.Fullname -Destination $_.Directory.Parent.Fullname}  

Trotzdem würde ich dringend dazu raten die PS zu aktualisieren, die 2er ist schon Jahrzehnte alt und hat diverse Bugs, von der Geschwindigkeit mal ganz abgesehen!
morph163
morph163 Jun 22, 2023 at 22:42:51 (UTC)
Goto Top
Danke dir. Das funktioniert. Ist es denn auch möglich das ganze zu verschieben anstatt zu kopieren?
7426148943
7426148943 Jun 22, 2023 updated at 22:52:26 (UTC)
Goto Top
Zitat von @morph163:

Danke dir. Das funktioniert. Ist es denn auch möglich das ganze zu verschieben anstatt zu kopieren?

Klar ersetze einfach das copy-item durch move-item.

Warum schreibt man das dann nicht gleich in den Beitrag, oben steht ja überall "kopieren"?!

RTFM
morph163
morph163 Jun 22, 2023 at 23:14:35 (UTC)
Goto Top
Danke dir, Zeppel. Kopieren ist schon das richtige, zumindest im Moment. Für die Zukunft wird es dann vielleicht die move-item Option.

Vielen Dank
morph163
morph163 Nov 05, 2023 at 01:09:26 (UTC)
Goto Top
Hallo,
ich muss das Thema leider wieder öffnen.
Ich weiß nicht ob das damals wirklich funktioniert hat oder ich nur nicht aufmerksam genug war. Was bei
Get-ChildItem "c:\log" -Directory | %{copy-item "$($_.Fullname)\*" -Destination $_.Parent.Fullname}    
passiert ist: Die Unterordner werden im "Hauptordner" erstellt, allerdings ohne Inhalt.
Die zweite Option funktioniert bei mir gar nicht - keine Fehlermeldung - einfach gar keine Reaktion.
Die dritte Option ergibt: c:\logs\123\abc\* -> Das System kann die angegebene Datei nicht finden. 0Datei(en) kopiert. Und das dann für alle Ordner (also z.b c:\logs\123\bdc\ oder c:\logs\234\bdc\)