The estimated reading time 3 minutes
Hallo zusammen,
immer wieder führe ich kleinere Fileservermigrationen durch. Oft stehe ich dann vor dem Problem, dass ich auf dem neuen Fileserver eine neue Struktur aufbaue. Hierzu habe ich eine kleine Excel Vorlage erstellt, welche mir die Zuordnung der Ordner durchführt und den entsprechenden Robocopy Job generiert.
Siehe hier mein Beispiel:
=(""&B3&"|robocopy ""\\oldfile\share\"&A3&""" ""\\newfile\share\"&B3&""" /MIR /COPY:DAT /DCOPY:T /R:2 /W:3 /LOG+:""\\someserver\logs\%DATE:~6,4%-%DATE:~3,2%-%DATE:~0,2%-%time:~0,2%-%time:~3,2%-%time:~6,2%-"&B3&".log"" /TEE /NDL")
Aus der Spalte CSV Robocopy Job lässt sich nun eine neue CSV Datei erstellen, welche wir dann zu einem späteren Zeitpunkt in Powershell einlesen.
Nun erstelle ich in einem Tempverzeichnis die besagte CSV Datei (zuerst eine Textdatei in die der Inhalt aus dem Excel kopiert wird, danach benenne ich die TXT Datei einfach in CSV um)
Als „Header“ der CSV Datei definiere ich noch die Objekt Name (wird ebenfalls für das Powershell Skript benötigt). In meinem Fall „name|robocopyjob“
WICHTIG: es darf kein Leerzeichen im „Header“ sein (auch nicht am Ende), sonst funktioniert der Delimiter nicht mehr!
Nun muss natürlich noch in das Verzeichnis innerhalb der Powershell gewechselt werden, in dem die CSV Datei liegt. (set-location)
Zuerst kann diese auch eingelesen werden
$jobs = @() $jobs = (Import-Csv -Path .\robocopy-csvimportfile.csv -Delimiter "|") $jobs
Als nächsten Schritt kann das Skript ausgeführt werden.
foreach ($job in $jobs){ $name = ($job.name) $robocopy = ($job.robocopyjob) New-Item -Path .\ -Name "$name.cmd" -ItemType File -Force Get-Item -Path .\$name.cmd | Add-Content -Value "chcp 1252" Get-Item -Path .\$name.cmd | Add-Content -Value "$robocopy" Get-Item -Path .\$name.cmd | Add-Content -Value "pause" }
Im aktuellen Verzeichnis wird nun für jeden Ordner ein eigenes Robocopy Skript nach den Vorgaben komplett automatisiert erstellt.
Hier nun das komplette Skript am Stück mit Kommentaren und einer Erweiterung (die kompletten Jobs werden noch in eine all.cmd geschrieben, somit können alle Jobs auf einmal ausgeführt werden):
#define codepage (utf8 code would be 65001) $codepage = "1252" #create array for csv import $jobs = @() $jobs = (Import-Csv -Path .\robocopy-csvimportfile.csv -Delimiter "|") #write all robocopy jobs to variable $all = (($jobs.robocopyjob)) #generate new cmd file New-Item -Path .\all.cmd -ItemType File -Force #set encoding to west european latin (utf8 code would be 65001) Get-Item -Path .\all.cmd | Add-Content -Value "chcp $codepage" #adding content from $all to cmd file $all | Out-File -FilePath .\all.cmd -Append -Encoding utf8 -Force Get-Item -Path .\all.cmd | Add-Content -Value "pause" #foreach loop to generate the seperate robocopy jobs foreach ($job in $jobs){ $name = ($job.name) $robocopy = ($job.robocopyjob) New-Item -Path .\ -Name "$name.cmd" -ItemType File -Force Get-Item -Path .\$name.cmd | Add-Content -Value "chcp $codepage" Get-Item -Path .\$name.cmd | Add-Content -Value "$robocopy" Get-Item -Path .\$name.cmd | Add-Content -Value "pause" }
Viel Spaß beim Nachbauen. Antworte gerne auf Fragen. Falls euch der Artikel geholfen hat drückt auf „Helpful“
Vielen Dank.
Guten Tag,
sehr spannender Artikel, welcher eine super Grundlage für mein Vorhaben bildet.
Ich bin an dieser Stelle jedoch auf etwas Hilfe angewiesen, da für diese Tiefe mein Know-How nicht ausreicht.
Ich habe bereits eine CSV mit gelisteten Dateien. Diese sollen innerhalb von Powershell eingelesen und anschließend via robocopy archiviert werden.
In der CSV ist bereits der Dateiname angegeben (nach dem Powershell im Quellordner suchen muss Bsp.: 20230214).
Jeder Datei ist in der Spalte „Attribut“ außerdem ein Attribut zugeordnet (1; 2; 3) welches bestimmt, wohin die Datei kopiert werden soll (1=OrdnerA, 2= OrdnerB 3= OrdnerC). Dies bildet also eine Abhängigkeit. Es soll in der Quelle nach allen in der CSV gelisteten Dateien gesucht werden und diese anschließend auch archiviert, jedoch in Abhängigkeit des Attributs an verschiedene Ordner.
Und eben an dieser Stelle komme ich nicht weiter.
Kannst du mich hierbei unterstützen?
Hallo David,
kannst du mir mal auf die E-Mail Adresse eine Beispiel CSV schicken und eine Beispielordnerstruktur? Wenn ich das habe könnte ich mir mal ein paar Gedanken dazu machen und dir einen Vorschlag schicken. Können wir dann auch gerne wieder hier posten.
Viele Grüße
Alexander
[…] auch meinen Artikel zur automatischen Erstellung von Robocopy Jobs bei einer Fileserver […]