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-Key: 379892

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

Printed on: April 19, 2024 at 10:04 o'clock

Member: Tezzla
Tezzla Jul 11, 2018 at 15:04:32 (UTC)
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
Member: darebo
darebo Jul 11, 2018 at 15:16:53 (UTC)
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.
Member: colinardo
Solution colinardo Jul 11, 2018 updated at 16:18:25 (UTC)
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
Member: darebo
darebo Jul 12, 2018 at 13:11:49 (UTC)
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
Member: colinardo
Solution colinardo Jul 12, 2018 updated at 13:48:47 (UTC)
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  
}
Member: darebo
darebo Jul 12, 2018 at 14:18:23 (UTC)
Goto Top
Powershell Version und deine Variante kann ich erst morgen prüfen.

Danke nochmals.
Member: darebo
darebo Jul 13, 2018 at 08:06:04 (UTC)
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
Member: colinardo
colinardo Jul 13, 2018 at 08:19:50 (UTC)
Goto Top
Rischtisch.