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

Ausgedruckt am: 17.11.2024 um 03:11 Uhr

7426148943
7426148943 23.06.2023 aktualisiert um 10:13:50 Uhr
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 23.06.2023 aktualisiert um 00:21:17 Uhr
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
Lösung 7426148943 23.06.2023 aktualisiert um 00:30:28 Uhr
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 23.06.2023 um 00:42:51 Uhr
Goto Top
Danke dir. Das funktioniert. Ist es denn auch möglich das ganze zu verschieben anstatt zu kopieren?
7426148943
7426148943 23.06.2023 aktualisiert um 00:52:26 Uhr
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 23.06.2023 um 01:14:35 Uhr
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 05.11.2023 um 02:09:26 Uhr
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\)