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 Helpful ?
  • yes   no