Powershell: Datei kopieren und AddIn aktualisieren

Ausgehend von meiner letzten Anleitung, in der ich beschrieben habe, wie man den Abruf eines Powershell-Scriptes im Netzwerk verteilen kann, zeige ich nun ein einfaches Script, mit dem eine Datei kopiert wird. In einem zweiten Schritt erkläre ich, wie man ein AddIn für Microsoft Office aktualisiert.

Durch die erste Anleitung wird klar, dass hier nicht nur ein einfacher Kopiervorgang erklärt wird – haben alle User Zugriff auf dieses Script, sei es durch einen Link in einer E-Mail oder durch einen Shortcut auf dem Desktop (beides hier beschrieben), dann erfolgt dieses Update überall.

Ein einfacher Kopiervorgang

Dieses Script ist also unser erstes „MeinPowershellScript.ps1“. Dieses Script kopiert eine AccessDatenbank mit dem Namen „MeineDatei.accdb“ von einem Server in ein lokales Verzeichnis des Users, der das Script aufgerufen hat

Copy-Item -Path "\\MeinServer\Quellordner\MeineDatei.accdb" -Destination "C:\LokalesVerzeichnis\MeineDatei.accdb"

Wenn Sie sich schon ein wenig mit Powershell auskennen, dann fragen Sie sich möglicherweise: was ist, wenn die Datei schon existiert? Wie verhält sich dann dieser Kopiervorgang?

Die Schalter -Force und -Confirm

Das Powershell Cmd-Let „Copy-Item“ überschreibt als Default Einstellung vorhandene Dateien. Der Schalter -Force, so denken einige logischerweise, wäre für das Überschreiben zuständig. Das ist nicht korrekt! „Copy-Item“ überschreibt immer, es sei den Sie nutzen den Schalter -Confirm. Der Schalter -Force ist dafür gedacht, auch blockierte Dateien zu überschreiben. Die Annahme, dass ein Weglassen des -Force Schalters das Kopieren verhindert, ist also falsch!

# Kopier- und Schreibvorgang auch dann, wenn die Zieldatei in Benutzung ist
Copy-Item -Path "\\MeinServer\Quellordner\MeineDatei.accdb" -Destination -Force "C:\LokalesVerzeichnis\MeineDatei.accdb"

# Kopier- und Schreibvorgang nur, wenn Vorgang bestätigt wird
Copy-Item -Path "\\MeinServer\Quellordner\MeineDatei.accdb" -Destination -Confirm "C:\LokalesVerzeichnis\MeineDatei.accdb"

Als weitere Variante könnte man den Kopiervorgang nur auslösen, wenn die Zieldatei nicht existiert. D.h. man prüft den Zielpfad und macht den Kopiervorgang von dieser Bedingung abhängig:

if ((Test-Path "C:\LokalesVerzeichnis\MeineDatei.accdb") -eq $false) {
    Copy-Item -Path "\\MeinServer\Quellordner\MeineDatei.accdb" -Destination "C:\LokalesVerzeichnis\MeineDatei.accdb"
    }

Ist Ihnen aufgefallen, dass hier kein „==“ als Vergleichsoperator genutzt wird, wie es bei anderen Programmiersprachen der Fall ist? Das ist eine Besonderheit von Powershell. „==“ oder „!=“ oder „>=“ – so etwas gibt es bei Powershell nicht! Auf dieser Seite, werden die Vergleichsoperatoren von Powershell erklärt. Sie werden sofort verstehen, dass durch die Variantenvielfalt mit Operatoren wie -contains oder -like viele Dinge vereinfacht werden, die Sie in anderen Programmiersprachen nur mit eigenen Funktionen implementieren können.

Konkretes Beispiel: Updates eines AddIn

Jetzt wollen wir bei allen unseren Usern im Netzwerk ein Excel-AddIn aktualisieren. Wir haben in dem AddIn Updates gemacht und die sollen allen Nutzern zur Verfügung gestellt werden. Analog zu dem einfachen Kopiervorgang aus dem ersten Beispiel wäre das:

$zieldatei = "$Env:USERPROFILE\AppData\Roaming\Microsoft\AddIns\MeinAddIn.xla"
Copy-Item -Path "\\MeinServer\Quellordner\MeinAddIn.xla" -Destination $zieldatei

Bereits in dem ersten Beispiel, als ich gezeigt habe, wie man mit Powershell einen Desktop-Shortcut erstellt, habe ich eine $Env Variable genutzt. Die gibt es in Powershell in vielen Varianten. Sie repräsentieren die Standortordner einer Windows-Installation oder gibt Infos zu User, Hardware oder dem Netzwerk. In diesem Fall wird das AddIn in den Roaming Ordner des Users geschrieben – dort gehört es ja auch hin.