darebo
Goto Top

Dateien von der Quelle zum Ziel (eine Ebene höher) kopieren

Hallo,

es gibt einen Quellbereich mit mehreren tausend Ordnern und Dateien z.B.:

C:\temp\Quelle\*\N

  • - steht für wechselnde, beliebige Ordner (z.B. GUID)

Bsp:
C:\temp\Quelle\0A519B3F-17C1-4264-88B7-550D47ECC903\N\*.*
C:\temp\Quelle\0A0554C4-7CD2-48D6-AB9B-5ACAA2E8B227\N\*.*
C:\temp\Quelle\0CBCA949-9E83-4119-B3CD-5B3BFB9D8488\N\*.*
C:\temp\Quelle\EB6B5212-1DEE-4FA7-B7D7-D32606B32D4D\N\*.*
usw.

Unterhalb des letzten Ordners befinden sich jeweils unterschiedliche Dateien/Dateitypen. Es sollen aber u.a. nur die .txt Dateien vom Quell- zum Zielbereich kopiert werden. Die Struktur des Quellbereiches soll nicht verändert werden.

Aktuell ist der Zielbereich leer. Der Zielbereich soll schlussendlich nach der Kopieraktion fast die ähnliche Struktur ( GUID\*.txt ) wie der Quellbereich haben. Der Zielbereich liegt speichermäßig aber völlig woanders und die Dateien sollen eine Ebene höher rutschen. Zum Testen habe ich daher den nachfolgenden Bereich gewählt.

C:\temp\Ziel\*\

  • - steht für wechselnde Ordner aus der Quelle (z.B. GUID)

So soll nach der Kopieraktion der Zielbereich aussehen.
Bsp.:

C:\temp\Ziel\0A519B3F-17C1-4264-88B7-550D47ECC903\*.txt
C:\temp\Ziel\0A0554C4-7CD2-48D6-AB9B-5ACAA2E8B227\*.txt
C:\temp\Ziel\0CBCA949-9E83-4119-B3CD-5B3BFB9D8488\*.txt
C:\temp\Ziel\EB6B5212-1DEE-4FA7-B7D7-D32606B32D4D\*.txt
usw.

Ich hoffe es ist einigermaßen klar beschrieben.

Einige Ansätze mit der for-Schleife habe ich gemacht. Scheitere aber beim Anlegen der Zielstruktur mit jeweils einen Unterordner weniger.

Danke vorab für die Unterstützung.

Content-ID: 379892

Url: https://administrator.de/forum/dateien-von-der-quelle-zum-ziel-eine-ebene-hoeher-kopieren-379892.html

Ausgedruckt am: 17.04.2025 um 18:04 Uhr

Tezzla
Tezzla 11.07.2018 um 17:04:32 Uhr
Goto Top
foreach ($currywurst in (get-childitem "Root wo deine Zielordner liegen" -directory).fullname)  
{
  robocopy "Quellverzeichnis wo deine TXT liegt" "$currywurst" pommes.txt  
}

Durchläuft das Zielverzeichnis "Currywurst" und kopiert in jeden Unterordner die "Pommes.txt".
Kommt das so ungefähr hin?

VG
Tezzla
darebo
darebo 11.07.2018 um 17:16:53 Uhr
Goto Top
Sorry, ich glaube das passt nicht so. Die Zielstruktur gibt's es noch nicht. Diese soll sich wie weiter beschrieben aus Teilen der Quellstruktur zusammensetzen.

Aus dem Quellbereich sollen die fett markierten Ordner und die jeweils im letzten Unterordner (..\N\) befindlichen unterschiedlichen .txt Dateien an das Ziel kopiert werden:

C:\temp\Quelle\0A519B3F-17C1-4264-88B7-550D47ECC903\N\*.*
C:\temp\Quelle\0A0554C4-7CD2-48D6-AB9B-5ACAA2E8B227\N\*.*
C:\temp\Quelle\0CBCA949-9E83-4119-B3CD-5B3BFB9D8488\N\*.*
C:\temp\Quelle\EB6B5212-1DEE-4FA7-B7D7-D32606B32D4D\N\*.*
...

Zielbereich
C:\temp\Ziel\0A519B3F-17C1-4264-88B7-550D47ECC903\*.txt
C:\temp\Ziel\0A0554C4-7CD2-48D6-AB9B-5ACAA2E8B227\*.txt
C:\temp\Ziel\0CBCA949-9E83-4119-B3CD-5B3BFB9D8488\*.txt
C:\temp\Ziel\EB6B5212-1DEE-4FA7-B7D7-D32606B32D4D\*.txt

Daher müsste der Quellbereich eingelesen und nur der vorletzte Ordner (fett markierte) genommen werden und dieser Ordner im Zielbereich erstellt werden sowie die .txt Dateien dort hineinkopiert werden.
colinardo
Lösung colinardo 11.07.2018 aktualisiert um 18:18:25 Uhr
Goto Top
Servus,

Powershell (mit Kommentaren):
# Quellordner
$quelle = 'D:\quelle'  
# Zielordner
$ziel = 'D:\ziel'  
# Schleife über die Ordner der Quelle
gci $quelle -Directory | %{
    # Zielordner festlegen
    $target = "$ziel\$($_.Name)"  
    # Zielordner erstellen wenn er noch nicht existiert
    if(!(test-Path $target)){md $target -Force | out-null}
    #  Alle Textdateien aus dem Unterordner "\N" in die Zielstruktur kopieren 
    gci "$($_.FullName)\N" -Filter *.txt -Recurse -File | copy-item -Destination $target -Verbose  
}
oder Batch:
@echo off
set "quelle=D:\Quelle"  
set "ziel=D:\Ziel"  
for /d %%a in ("%quelle%\*") do (  
    if not exist "%ziel%\%%~nxa" md "%ziel%\%%~nxa" >nul  
    copy "%%~a\N\*.txt" "%ziel%\%%~nxa\"  
)
Grüße Uwe
darebo
darebo 12.07.2018 um 15:11:49 Uhr
Goto Top
Hallo Uwe,

danke für die Beispiellösungen.

Die Batchlösung funktioniert einwandfrei.

Bei der Powershell-Lösung erhalte ich folgende Fehlermeldung:

Get-ChildItem : Es wurde kein Parameter gefunden, der dem Parameternamen "Directory" entspricht.
Bei Zeile:6 Zeichen:23

back-to-topgci $quelle -Directory <<<< | %{

+ CategoryInfo : InvalidArgument: (face-smile [Get-ChildItem], ParameterBindingException
+ FullyQualifiedErrorId : NamedParameterNotFound,Microsoft.PowerShell.Commands.GetChildItemCommand

Kann aber den Fehler nicht direkt auflösen. Hast du noch eine Idee?

Danke.

Grüße darebo
colinardo
Lösung colinardo 12.07.2018 aktualisiert um 15:48:47 Uhr
Goto Top
Zitat von @darebo:
Bei der Powershell-Lösung erhalte ich folgende Fehlermeldung:
Kann aber den Fehler nicht direkt auflösen. Hast du noch eine Idee?
Ja eindeutig, du verwendest eine bereits sehr veraltete Powershell 2.0, die kennt die Parameter -Directory und -File noch nicht, lässt sich aber leicht für die PS2.0 umschreiben,

Gesamt dann so
#Quellordner
$quelle = 'D:\quelle'  
# Zielordner
$ziel = 'D:\ziel'  
# Schleife über die Ordner der Quelle
gci $quelle | ?{$_.PSIsContainer} | %{
    # Zielordner festlegen
    $target = "$ziel\$($_.Name)"  
    # Zielordner erstellen wenn er noch nicht existiert
    if(!(test-Path $target)){md $target -Force | out-null}
    #  Alle Textdateien aus dem Unterordner "\N" in die Zielstruktur kopieren 
    gci "$($_.FullName)\N" -Filter *.txt -Recurse | ?{!$_.PSIsContainer} | copy-item -Destination $target -Verbose  
}
darebo
darebo 12.07.2018 um 16:18:23 Uhr
Goto Top
Powershell Version und deine Variante kann ich erst morgen prüfen.

Danke nochmals.
darebo
darebo 13.07.2018 um 10:06:04 Uhr
Goto Top
Ja es lag an der Powershell Version (2.x).

Daher funktioniert jetzt deine Lösung bestens. Dafür Danke nochmal.

Wenn man noch mehr Dateitypen einschließen möchte, dann kann man die Zeile 12 auch mit folgende Code-Vorschlag ersetzen:

  1. Kopierfunktion mit mehr als nur einem Dateityp Filter
gci "$($_.FullName)\N" -include ('*.txt', '*.rtf') -Recurse | ?{!$_.PSIsContainer} | copy-item -Destination $target -Verbose
colinardo
colinardo 13.07.2018 um 10:19:50 Uhr
Goto Top
Rischtisch.