Automatisiert Robocopy Scripts anhand von Ordnernamen erstellen

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.

Print Friendly, PDF & Email
Was this article helpful?
YesNo
0 0 votes
Article Rating
Abonnieren
Benachrichtige mich bei
guest
3 Comments
Newest
Oldest Most Voted
Inline Feedbacks
View all comments
David Bahrmann
David Bahrmann
1 Jahr zuvor

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?

trackback
2 Jahre zuvor

[…] auch meinen Artikel zur automatischen Erstellung von Robocopy Jobs bei einer Fileserver […]