Archiv der Kategorie: Powershell

Automatischer Browser Reload – mit Visual Studio Code

Einer der wichtigsten und flexibelsten (und auch kostenfreien) Editoren für Entwickler ist sicher Visual Studio Code. Auf allen Plattformen verfügbar – man muss sich nur ein wenig an das Konzept gewöhnen.

Der von mir beschriebene sehr hilfreiche automatische Browser Reload aus diesem Post, kann auch mit Visual Studio Code ausgelöst werden. Es ging um dieses Powershell Script, das wir einfach mal „BrowserRefresh.ps1“ nennen:

$wshell=New-Object -ComObject wscript.shell;
$wshell.AppActivate('Firefox Developer Edition'); # Aktiviere Firefox Develope Edition 
$wshell.SendKeys('^{F5}'); # Refresh The Browser
Write-Host "Firefox aktualisiert"

Um es in Visual Studio Code aufzurufen, muss ein Task angelegt werden (task.json) – wie das geht, erfährt man in der Dokumentation zu VS Code. In der Regel kann die Datei über F1 und dann Task -> Aufgabe konfigurieren angelegt werden, falls noch nicht vorhanden.

Der Eintrag sieht dann so aus:

Task in VS Code für Browser Refresh

"reveal" : "never"

bewirkt übrigens, dass das Ergebnis des Scripts nicht im internen Terminal von VS Code angezeigt wird (sehr nervig).

Dann muss man das Script nur noch über Tastenkombination (bei mir STRG + WIN + R) aufrufen (auch wieder F1 -> Tastenkombinationen JSON aufrufen):

Key für VS Code Browser Refresh

Das wollte ich zu dem ursprünglichen Post noch ergänzen – auch in VS Code ist das Aufrufen solcher nützlichen Scripts problemlos möglich.

 

 

Automatischer Browser Reload

Welcher Webentwickler kennt dieses Problem nicht?  – Man ändert einzelne Komponenten auf einer Seite und möchte das Ergebnis dann im Browser sehen. Also öffnet man den Browser, macht einen Reload – in der Regel mit zu löschendem Cache, falls sich auch CSS oder Javascript Files geändert haben – und schaut sich das Ergebnis an. Der Browser läuft bereits auf einem eigenen Monitor, aber das Refreshing ist lästig.

Lösungen wie „Live.js“ oder „LiveReload“ funktionieren nicht (oder ich war zu blöd für die Einrichtung). Was also tun? Auch hier hilft wieder Powershell. Das nachfolgende Script sendet an einen geöffneten Firefox (Developer Edition) SHIFT + F5 – der Browserinhalt wird neu geladen.

$wshell=New-Object -ComObject wscript.shell;
$wshell.AppActivate('Firefox Developer Edition'); # Aktiviere Firefox Develope Edition 
$wshell.SendKeys('^{F5}'); # Refresh The Browser
Write-Host "Firefox aktualisiert"

Was soll jetzt aber der Vorteil sein? Nun, sicher ist es kein Vorteil, ein Powershell-Script aufzurufen, statt in den Browser zu wechseln. Der Aufwand wäre sogar größer. Aber man kann dieses Script in seine Arbeitsumgebung als externes Tool einbauen und mit einem Shortcut versehen. UltraEdit oder die IDEs von JetBrains bieten dafür einfache Schnittstellen. Ich schreibe meinen Code mit PHPStorm und da sieht das dann so aus:Browser Reload mit phpStorm

Program: powershell.exe

Arguments: Der Pfad zu dem oben beschriebenen PowershellScript

Working Directory : Der Pfad zur powershell.exe, falls dieser nicht bereits in der PATH Variable des Systems integriert ist.

Man kann dieses Script natürlich auch als Shortcut auf einem Desktop abrufen, ohne eine Umgebung zu nutzen. Nachteil dabei ist, dass sie den Konsolenoutput nicht umleiten oder unterdrücken können – es öffnet sich immer ein Powershell-Terminal.

Die Arbeitserleichterung liegt darin, dieses Script mit einem Shortcut zu versehen oder – vielleicht sogar noch besser – über ein Makro in der Entwicklungsumgebung mit dem Speichervorgang zu verknüpfen. Jedes Mal, wenn eine Seite oder eine Datei gespeichert wird, wird auch der Browser neu geladen. Noch besser: natürlich können Sie das Script erweitern und gleich mehrere verschiedene Browser refreshen. Das kann wichtig sein, wenn Sie Anwendungen entwickeln, die zuverlässig in mehreren Browsern laufen sollen.

 

 

Powershell: ODBC Schnittstellen erneuern

Powershell

Sie kennen das vielleicht: endlich wurde der Datenbankserver erneuert und auf den neuesten Stand gebracht. Es gibt zahllose Anwendungen, die über Microsoft Access oder Excel auf den Datenbestand zugreifen. Dafür haben Sie vor Jahren eine ODBC Schnittstelle bei jedem User eingerichtet. Jetzt sind die User aber alle im HomeOffice oder aus zwei oder drei Usern wurden mittlerweile Dutzende, die mit ihren Programmen arbeiten.

Nun, dieser Beitrag aus dem Bereich „Coding“ erklärt. wie Sie diese Schnittstellen über Powershell bei allen Nutzern gleichzeitig aktualisieren können. Wie Sie so ein Script per Mail und mit der Hilfe von VBScript mühelos verteilen können, hatte ich in dem ersten Beitrag der Serie erklärt. Dieses Script wäre also jetzt eine neue Variante von „MeinPowershellScript.ps1“.

Import-Module Wdac
Remove-OdbcDsn -Name "MeineODBC_Verbindung" -Platform "32-bit" -DsnType "User"
Add-OdbcDsn "MeineODBC_Verbindung" -DriverName "ODBC Driver 17 for SQL Server" -DsnType User -Platform 32-bit -SetPropertyValue @("Server=SERVERADRESSE", "Trusted_Connection=Yes", "Database=MeineDatabase") -PassThru

Dazu muss ich einiges erklären. Import-Module Wdac ist zwingend notwendig. Damit werden in das Powershellscript die Windows Data Access Components geladen. Diese beinhalten die beiden nachfolgend genutzten Befehle.

Zunächst entfernen wir die vorhandene, veraltete ODBC Verbindung namens „MeineODBC_Verbindung“ mit Remove-OdbcDsn. Warum? Nun ich gehe davon aus, das der Name der ODBC Verbindung schon in zahlreichen Tools genutzt wird, z.B. als Datenquellen in AccessDatenbanken. Damit sie diese nicht neu umschreiben müssen, nutzen wir für die neue ODBC Verbindung die gleiche Bezeichnung. Und dazu müssen wir die alte erst entfernen.

Bitte beachten Sie, dass Sie auf User-Ebene in ihrem Script auch nur Benutzer-DSN löschen und erstellen können. System-DSN könnten von den vom User ausgeführten Script nur erstellt werden, wenn der User auch Systemadministrator ist. Daher nutzen wir als Schalter -DsnType „User“. Der Plattform Typ -32 oder 64 Bit – muss ggf. angepasst werden.



Dann folgt mit Add-OdbcDsn die Erstellung der neuen ODBC Verbindung. Der Name ist identisch mit der alten Verbindung. Die nachfolgenden Parameter müssen Sie natürlich anpassen. Zunächst der ODBC Treiber analog zum genutzten Datenbanksystem. In diesem Beispiel ist das ein Microsoft SQL Server. Für Oracle oder MySQL müssen Sie natürlich die entsprechenden Treiber installieren und dann den Treibernamen exakt angeben.

Dann folgen Plattformtyp und DsnType (auch hier wird wieder nur „User“ funktionieren. Der nachfolgende Teil hängt davon ab, mit welchem Sicherheitskonzept ihre User mit der Datenbank kommunizieren. In diesem Beispiel wird die ActiveDirectory Kennung der Users, die auch für den SQL Server gültig ist, an den Server durchgereicht. Haben Sie ein anderes Sicherheitskonzept, dann müssen Sie die Parameter entsprechend anpassen. Ich denke, dieses Beispiel dürfte eines der am häufigsten vorkommenden Szenarios sein. Alle weitere Parameter mit vielen Beispielen, finden Sie auf dieser Support-Seite von Microsoft.

Noch ein Hinweis: Wenn Sie die Tabellen der Datenbank in Access verbunden haben, dann müssen Sie diese in den Tabellenverknüpfungen einmalig aktualisieren. Das können Sie machen, bevor Sie die AccessDatenbank an diese User ausgeben. Wie das funktionieren könnte, hatte ich auch schon erklärt.

 

 

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.