bommi1961
Goto Top

Powershell, mit FOR-Schleife Verzeichnise kopieren

Hallo zusammen,

ich suche nach einer Möglichkeit, mein Sicherungsskript noch besser zu machen.

Stand jetzt:

$var = "c:\tools\Variabeln.txt"  
$lines = Get-Content $var						#	C:\Tools  
$lines[0]										#	Quelle 
$lines[1]										#	Quelle
# $lines[2]										#	Quelle
# $lines[3]										#	Quelle
# $lines[4]										#	Quelle
# $lines[5]										#	Quelle


Copy-Item -Path $lines[0] -Destination $ziel_DA -Recurse
Copy-Item -Path $lines[1] -Destination $ziel_DA -Recurse
Copy-Item -Path $lines[2] -Destination $ziel_DA -Recurse

Das geht doch bestimmt auch "schöner", ich finde nur nicht wie.

Ich habe es so versucht:

$Zeile = (Get-Content 'c:\tools\Variabeln.txt').Length  

$var = "c:\tools\Variabeln.txt"  


$lines = Get-Content $var						#	C:\Tools  
$lines[0]										#	Quelle 
$lines[1]										#	Quelle
$lines[2]										#	Quelle
$lines[3]										#	Quelle
$lines[4]										#	Quelle
$lines[5]										#	Quelle

$W = 0

foreach ($Zeile in $W)
 {
    Write-Host "Copy"+$lines[$W]  
    pause
}
komme aber leider nicht weiter.

Über Tips würde ich mich sehr freuen.

VG

Content-Key: 63696120746

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

Printed on: April 27, 2024 at 13:04 o'clock

Member: erikro
Solution erikro Dec 18, 2023 at 10:24:07 (UTC)
Goto Top
Moin,

bitte code tags benutzen.

Deine Schleife ist falsch. So geht das:

foreach($line in $lines) {

      mach-was $line

}

hth

Erik
Mitglied: 10138557388
10138557388 Dec 18, 2023 updated at 10:31:00 (UTC)
Goto Top
Oder gleich ohne Schleife
Copy-Item -Path $lines -Destination $ziel_DA -Recurse
Path erlaubt ein Array an Pfadangaben
https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell ...
Member: Bommi1961
Bommi1961 Dec 18, 2023 at 11:36:55 (UTC)
Goto Top
Müsste dann so aussehen?
$var = "c:\tools\Variabeln.txt"  
$lines = Get-Content $var						#	C:\Tools  
$lines[0]										#	Quelle 
$lines[1]										#	Quelle


$ziel_DA = "C:\temp"  


Copy-Item -Path $lines -Destination $ziel_DA -Recurse

leider wird keine Kopie erstellt.
Mitglied: 10138557388
10138557388 Dec 18, 2023 updated at 11:44:35 (UTC)
Goto Top
Was steht denn überhaupt in "c:\tools\Variabeln.txt" ?
Klappt hier problemlos wenn in der Textdatei Pfade zu Ordnern enthalten sind.

Demo hier
https://tio.run/##bY5NC8IwEETv@RVL6DUN9i4UFLyKB@9pu9JgzJZkgx/432ttCy3odR ...
Member: Bommi1961
Bommi1961 Dec 18, 2023 at 11:48:46 (UTC)
Goto Top
C:\Tools
C:\Users\Admin\Downloads

zum Test die beiden Einträge
Mitglied: 10138557388
10138557388 Dec 18, 2023 updated at 11:54:01 (UTC)
Goto Top
Siehe Beispiel das es einwandfrei klappt, Zielordner muss existieren ansonsten im Skript anlegen. Entsprechende Rechte in den Ordnern ebenfalls.
Ohne Fehlermeldung kann man dir nicht helfen ... Das man das hier noch erwähnen muss ist schon traurig.
Member: Bommi1961
Bommi1961 Dec 18, 2023 at 11:59:02 (UTC)
Goto Top
Dass das Ziel vorhanden sein muss weiß ich. Ist es auch.
Wenn er mir eine Fehlermeldung angezeigt hätte, hätte ich die mit geschickt, leider macht er das nicht.
Mitglied: 10138557388
10138557388 Dec 18, 2023 updated at 12:41:35 (UTC)
Goto Top
Dann ist deine PowerShell zu alt oder das Skript nicht im richtigen Encoding gespeichert (UTF-8 with BOM) oder die Textdatei hat ein Encoding das vom Standard abweicht (hier dann das Encoding der Datei mit dem -Encoding Parameter definieren) .
Member: Cloudrakete
Cloudrakete Dec 18, 2023 at 13:56:54 (UTC)
Goto Top
Servus,

die Frage war ja "wie es schöner" gehen könnte face-smile
Ich würde einige Dinge anders lösen, zum Beispiel das ich meine Backups nicht mit PowerShell mache, aber nun denn.

Ich würde es nicht mit Textfiles machen, die sind für das Einlesen immer so "naja"
Schöner und modern klappt das ganze mit JSON-Files.

PS-Copy Skript:

# Backups aus JSON laden
$sourcesjson = Get-Content -Path "C:\Temp\filecopyscript\sources.json" | ConvertFrom-Json  

# Durchführung Kopiervorgänge
foreach ($backupitem in $sourcesjson.backupitem) {
    $src = $backupitem.src
    $dst = $backupitem.dst
   
        #Kopiervorgang
        Copy-Item -Path $src -Destination $dst -recurse -Force -Verbose 
}


Dazugehöriges JSON:

{
  "backupitem": [  
    {
      "_comment": "Backup 01",  
      "src": "C:\\Temp\\filecopyscript\\Test\\SRC1",  
      "dst": "C:\\Temp\\filecopyscript\\Test\\DST1"  
      
    },
    {
      "_comment": "Backup 02",  
      "src": "C:\\Temp\\filecopyscript\\Test\\SRC2",  
      "dst": "C:\\Temp\\filecopyscript\\Test\\DST2"  
    },
    {
      "_comment": "Backup 02",  
      "src": "C:\\Temp\\filecopyscript\\Test\\SRC3",  
      "dst": "C:\\Temp\\filecopyscript\\Test\\DST3"  
    }
  ]
}


Im JSON-File kannst Du nach unten gezeigter Form immer weitere Blöcke hinzufügen, welche die Schleife durchlaufen sollen.
Wenn Du weitere Parameter brauchst, kannst Du diese ebenfalls im jeweiligen Block hinzufügen. Ich nutze z.B. immer Kommentar-Parameter, welche nicht aber nicht weiter auswerte, da JSON selbst keine Kommentare kennt.

Wichtig ist bei Pfadangaben in JSON allerdings, dass du mit "//" statt "/" arbeiten musst, da ein Slash als Escape-Character gilt.
Wenn Du das grundlegende Prinzip einmal verstanden hast ist es deutlich angenehmer damit zu arbeiten, als mit irgendwelchen Textfiles, die keinerlei Struktur kennen.
Member: Bommi1961
Bommi1961 Dec 18, 2023 at 15:09:24 (UTC)
Goto Top
Vielen Dank, das werde ich mal ausprobieren, wieder etwas dazu gelernt.
Member: kreuzberger
kreuzberger Dec 19, 2023 at 10:37:22 (UTC)
Goto Top
Moin @Bommi1961

warum nimmst du nicht einfach robocopy.exe?

Kreuzberger
Member: Bommi1961
Bommi1961 Dec 19, 2023 at 12:32:09 (UTC)
Goto Top
Hallo Kreuzberger,

weil ich PowerShell lernen will und dazu eine Aufgabe brauche.

Ich lerne hier bei den Antworten so viel, besser als aus einem Buch oder anderen Web Seiten.

Viele Grüße