mshm17
Goto Top

Powershell Get-ChildItem - Copy-Item mit Array

Hallo zusammen,

kurze Anfängerfrage:
$quelle = Read-Host -Prompt 'Eingabe vom Quellverzeichnis!'  
$arrayZiel = @()
do {
$eingabe = (Read-Host "Bitte Ziel eingeben - sofern keins mehr noetig, bitte mit -ok- bestaetigen")  
if ($eingabe -ne '') {$arrayZiel += $eingabe}  
}
until ($eingabe -eq 'ok')  
$arrayZiel

Get-ChildItem $quelle -Recurse | Copy-Item -Destination $Ziel
pause

Ziel ist es, dass Dateien eines bestimmten Ordners in mehrere Ziele kopiert werden. Das Einlesen der variablen $quelle funktioniert auch ohne Probleme, jedoch passt das mit dem Ziel nicht ganz. Die Dateien werden aktuell in das Verzeichnis kopiert, in dem die PS liegt.

Kann mir jemand bitte kurz auf den Sprung helfen ?

Gruß

Content-ID: 639709

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

Ausgedruckt am: 25.11.2024 um 03:11 Uhr

Doskias
Doskias 12.01.2021 aktualisiert um 15:08:15 Uhr
Goto Top
Moin,

wenn das alles ist an deinem Skript:

Am Ende gibt du -destination mit $Ziel an. $Ziel wird aber nicht definiert. da müsste vermute ich $arrayZiel stehen, oder?

Wenn ja bedenke aber, dass dein Array am Ende aus den Pfaden und dem Eintrag ok besteht.

Gruß
Doskias
mshm17
mshm17 12.01.2021 um 15:17:05 Uhr
Goto Top
So wie es da steht, hat das Array dann nicht den Eintrag "ok". Aber dein Ansatz funktioniert ebenfalls nicht - hatte ich bereits getestet,
Doskias
Doskias 12.01.2021 um 15:22:14 Uhr
Goto Top
Also ich hab grade folgendes bei mir erfolgreich ausprobiert:
$quelle = Read-Host -Prompt 'Eingabe von Quellverzeichnis!'  
$arrayZiel = @()
do {
$eingabe = (Read-Host "Bitte Ziel eingeben - sofern keins mehr noetig, bitte mit -ok- bestaetigen")  
if ($eingabe -ne '') {$arrayZiel += $eingabe}  
}
until ($eingabe -eq 'ok')  
$arrayZiel

Get-ChildItem $quelle -Recurse | Copy-Item -Destination $arrayZiel
Get-ChildItem $quelle -Recurse | Copy-Item -Destination $arrayZiel[1]
Get-ChildItem $quelle -Recurse | Copy-Item -Destination $arrayZiel[2]
Get-ChildItem $quelle -Recurse | Copy-Item -Destination $arrayZiel[3]

Der 4 Copy Befehl hat einen Fehler ausgeworfen, weil es "ok" war, die anderen 3 haben funktioniert. Wobei ich (sehe ich grade) nur eine Datei kopiert habe und keinen ganzen Ordner, indem ich C:\test\test.txt als Quelle eingegeben habe. Und ja, Copy Item würde ich bei einem echten Skript so nicht stehen lassen, das ist nur zum zeilenweisen Test.
mshm17
mshm17 12.01.2021 um 15:43:15 Uhr
Goto Top
Wie würdest du es lösen ?

Gruß
Doskias
Lösung Doskias 12.01.2021 um 16:05:21 Uhr
Goto Top
Ich würde es so machen:

$quelle = Read-Host -Prompt 'Eingabe von Quellverzeichnis!'  
$arrayZiel = @()
do {
$eingabe = (Read-Host "Bitte Ziel eingeben - sofern keins mehr noetig, bitte mit -ok- bestaetigen")  
if ($eingabe -ne '') {$arrayZiel += $eingabe}  
}
until ($eingabe -eq 'ok')  
$arrayZiel

foreach($Pfad in $arrayZiel)
 {
 if ($pfad -ne "ok")  
 {
 Copy-Item $quelle -Recurse $Pfad -Force
 }
}

Allerdings: Wenn du als Quelle zum Beispiel c:\temp\Quelle wählst und als Ziel c:\temp\Test, dann passiert folgendes:

Ist Test nicht vorhanden wird der Inhalt von c:\temp\Quelle nach c:\temp\Test geschrieben
Ist Test vorhanden, dann wird der Inhalt von c:\temp\Quelle nach c:\temp\Test\Quelle geschrieben.

Kenne jetzt deine Struktur nicht aber ggf. müsste man mit test-path noch prüfen ob der Ordner vorhanden ist der als Ziel eingegeben wurde.
erikro
Lösung erikro 12.01.2021 um 16:15:51 Uhr
Goto Top
Moin,

warum einfach, wenn es auch kompliziert geht. face-wink

$quelle = Read-Host -Prompt 'Eingabe vom Quellverzeichnis!'  
$arrayZiel = @()

do {

    $eingabe = (Read-Host "Bitte Ziel eingeben - sofern keins mehr noetig, bitte mit Enter bestaetigen")  

    if ($eingabe) {
                    $arrayZiel += $eingabe
                  }

}
until (-not $eingabe)

foreach($ziel in $arrayZiel) {

    if(Test-Path($ziel)) {

        Copy-Item $quelle\* -Recurse -Destination $ziel

    }
    else {

        write-error "$ziel existiert nicht!"  

    }

}

Ob der Quellpfad exisistiert, sollte man vielleicht auch noch testen. face-wink

hth

Erik
mshm17
mshm17 12.01.2021 um 16:21:26 Uhr
Goto Top
perfekt ! Vielen Dank!

Gruß