Windows PowerShell Skript erstellen und ausführen - erlauben
Im einfachsten Fall ist ein PowerShell-Skript eine Textdatei mit einer Reihe von PowerShell-Befehlen. Als PowerShell Skript versteht man eine Datei mit der Endung .ps1. Die Skriptdatei kann eine Sammlung von Befehlen, Funktionen oder Cmdlets enthalten.
Mit PowerShell kann nahezu alles automatisiert werden, angefangen von einfachen Abläufen bis hin zu komplexen Programmabläufen. Neben der klassischen PowerShell Konsole gibt es für das Skripting noch die PowerShell-Entwicklungsumgebung (PowerShell ISE), diese ist im Grunde ein für PowerShell optimierter Texteditor mit integrierter Konsole. Die Entwicklungsumgebung kann einfach über den Suchdialog von Windows aufgerufen werden:
Starten der PowerShell Entwicklungsumgebung (ISE)
In der oberen Hälfte befindet sich der Quellcode, die untere Hälfte zeigt die PowerShell-Befehlszeile und im rechten Bereich können PowerShell-Befehle gesucht und eingefügt werden:
unser erstes Skript
Unser erstes Skript soll einfach nur "hello" ausgeben:
dazu wird folgender PowerShell Befehl verwendet:
Write-Host "hello".
Der Befehl wird also in den Skriptbereich geschrieben. Beim Starten des Skripts (grüne Pfeiltaste), wird das Skript in der Befehlszeile gestartet.
Beispielvideo: erstellen eines Powershellskripts
Execution-Policy
Die Execution-Policy schützt den Computer vor dem Ausführen von nicht vertrauenswürdigen Skripts.
Abhängig von der Execution-Policy Einstellung, diese ist je nach Betriebsystemversion unterschiedlich, kann das Skript eventuell nicht ausgeführt werden.
Die Einstellung ist in Windows standardmäßig auf "restricted", was das Ausführen von Skripts verhindert, folgender Fehler wird angezeigt:
Die Datei "C:\Users\test2\Desktop\test.ps1" kann nicht geladen werden, da die Ausführung von Skripts auf diesem System deaktiviert ist. Weitere Informationen finden Sie unter "about_Execution_Policies" unter
"http://go.microsoft.com/fwlink/?LinkID=135170".
+ CategoryInfo : Sicherheitsfehler: (:) [], ParentContainsErrorRecordException
+ FullyQualifiedErrorId : UnauthorizedAccess
"Restricted" lässt Befehle in der PowerShell-Konsole zu, verhindert aber das Ausführen von Skripts.
Die Standardeinstellung beim Doppelklick auf ein PowerShell-Skript (Dateiendung .ps1) startet den Editor.
PowerShell-Skripts erlauben
Die PowerShell-Execution-Policy verhindert das Ausführen von PowerShell-Skripts wenn diese auf "Restricted" gesetzt sind.
Um die Execution-Policy anzuzeigen und später anzupassen, starte ich PowerShell als Administrator:
mittels get-executionpolicy -list
kann die aktuelle Einstellung angezeigt werden:
Mit dem Befehl set-executionpolicy
kann die Einstellung angepasst werden.
Als Beispiel erlaube ich lokale Skripts oder signierte Skripts aus dem Internet mit der Policy "RemoteSigned".
Der vollständige Befehl lautet dann: Set-ExecutionPolicy remotesigned
Set-ExecutionPolicy unrestricted
würde alle PowerShell Skripts erlauben. Diese Einstellung sollte aus Sicherheitsgründen nicht verwendet werden, da auch unsichere Skripts aus dem Internet funktionieren würden. Empfohlen ist also "remotesigned". Unbekannte Skripts können im Explorer mit einem Rechtsklick: "Eigenschaften" und "Zulassen" erlaubt werden.
Alternativ können Dateien auch mit dem PowerShell-Befehl Unblock-File
erlaubt werden:
mit Unblock-File *\*
können auch mehrere Dateien erlaubt werden.
Zone-Identifier
Der Unterschied zwischen einem lokal erstellten und einem vom Internet kopierten Skript ist der Zone-Identifier.
Damit das Internet-Skript ausgeführt werden kann, muss dies vorab zugelassen werden:
Wird ein PowerShell-Skript vom Internet kopiert, bekommt die Datei folgenden Zone-Identifier:
Add-Content -Path 'Script.ps1' -Value "[ZoneTransfer]`nZoneId=3" -Stream 'Zone.Identifier'
Der Klick auf "Zulassen" löschten den Zone Zone-Identifier, analog des folgenden Befehles
Clear-Content -Path 'Script.ps1' -Stream 'Zone.Identifier'
Bypass
Fertige Skripts können später auch ohne Anpassung der ExecutionPolicy gestartet werden, dazu wird die Datei aus der Eingabeaufforderung über die PowerShell.exe mit dem Flag: Bypass aufgerufen:
PowerShell.exe -ExecutionPolicy Bypass -File .unbekannt.ps1
Anstelle der Datei kann auch ein Befehl übergeben werden:
Powershell -command "Write-Host 'Hallo'"
mehrere Befehle können mit einem Strichpunkt getrennt werden:
Powershell -command "Write-Host 'Hallo'; Write-Host 'du'"
Es wäre sogar folgendes Beispiel möglich: Eine .cmd-Datei lädt eine externe Skript-Datei und startet eine darin enthaltene Funktion mit bestimmten Parametern.
PowerShell.exe -ExecutionPolicy Bypass -command ". \\share\myFunctions.ps1; one-of-the-functions-in-myFunctions -paramteter1 1 -parameter2 2"
Details zur myFunctions.ps1 siehe: PowerShell Übergabe von Variablen (Param)
Ausführen des Skripts
Für das Ausführen des Skripts aus PowerShell, muss der vollständige Pfad angegeben werden. Sollte sich die PowerShellkonsole bereits im Skriptpfad befinden, kann das Skript mit .\ vor dem Dateinamen gestartet werden.
Als Beispiel erzeuge ich folgendes PowerShell-Skript unter c:\temp\test.ps1
Inhalt des Textfiles:
Write-Host "hello"
Da es sich auch bei PowerShell um Textdateien handelt, können diese auch im Editor erstellt werden.
Der Aufruf über den vollständigen Pfad sieht dann so aus:
Der Aufruf aus dem Pfad c:\temp:
wie erstelle ich einen eigenen PowerShell Befehl: Cmdlet
Befehle in Powershell nennen sich Cmdlets und sind Funktionen an die bestimmte Variablen übergeben werden können. Die Funktion führt dann bestimmte Aufgaben aus und übergibt das Ergebnis mittels "return" an die Konsole. ... weiterlesen
PowerShell Cmdlet Hilfe
Die Hilfe in einem selbst erstellten Cmdlet ist ein einfacher Kommentarblock am Beginn einer Funktion, bzw. am Anfang einer PowerShell Skript-Datei. ... weiterlesen
PowerShell: Cmdlet (erweiterte Funktion)
In PowerShell ISE kann mit Strg+J eine Vorlage für ein PowerShell Cmdlet eingefügt werden. Die Vorlage erweitert das Skript um Elemente für die Dokumentation und gibt damit der integrierten PowerShell-Hilfe alle notwendigen Informationen für das Cmdlet: "get-help". ... weiterlesen
PowerShell Übergabe von Variablen an ein Skript (Param)
Zu Beginn eines PowerShell Scripts können Parameter in der Funktion Param() definiert werden. ... weiterlesen
PowerShell Errorhandling: Write-Debug DebugPreference
Damit die Fehlersuche in PowerShell einfacher wird, können bei Bedarf zusätzliche Debug-Ausgaben in das Skript eingebaut werden. ... weiterlesen
PowerShell Aufruf von einer Batch-Datei cmd - Errorlevel
Der Aufruf eines PowerShell-Skripts aus der Eingabeaufforderung: cmd oder über eine Batch-Datei kann über die powershell.exe erfolgen. Sollten mehrere PowerShell-Scripts gestartet werden, kann der Exitcode / das ErrorLevel pro Zeile behandelt werden. In der Batch-Datei wird dafür die Variable %errorlevel% verwendet. %errorlevel% enthält den Returncode der zuletzt ausgeführten Zeile: ... weiterlesen
{{percentage}} % positiv
DANKE für deine Bewertung!
Fragen / Kommentare
(sortiert nach Bewertung / Datum) [alle Kommentare(neueste zuerst)]
User: Joey Ich benötige den Code damit ich mein Powershellscript starten kann und die Windows apps deinstalliert werden. Hab das schon ein Script ist auch automatisiert nur das Problem ist ich kann es nicht Automatisiert starten. Ich kopier sozusagen den Text in Powershell und starte so das Script. Könnte mir da jemand bitte weiterhelfen. Danke # Unerwünschte Apps anzeigen und ggf. entfernen (für den aktuellen Benutzer) $unerwünschteApps = "xboxapp", "BingNews", "Dolby", "BingWeather", "Zune", "WindowsCamera", "WindowsMaps","Microsoft.People","PhotoShopExpress","Microsoft.OneConnect","Solitaire","Print3D","SoundRecorder","Duolingo","freshpaint","3D Builder","Feedback Hub","Sway","Get Office","Groove Music","Microsoft Wallet" $remove = $true foreach($a in $unerwünschteApps) { Write-Host "Installierte Apps mit $a im Titel:" -ForegroundColor Yellow $menge = Get-AppxPackage | where name -like "*$a*" # Get-AppxProvisionedPackage -Online / DisplayName $menge | ft if ($menge.length -eq 0) { Write-Host "Keine :-)" -ForegroundColor green } else { if ($remove) { "Entferne $($menge.length) Apps.." $menge | Remove-AppxPackage # Remove-AppxProvisionedPackage -online $menge = Get-AppxPackage | where name -like "*$a*" if ($menge.length -gt 0) { Write-Host "folgende Apps wurden NICHT entfernt:" -ForegroundColor red $menge | ft } } } }
User: SubPORT Hey Webmaster, vielen Dank für die tolle Seiten. Daumen hoch.
User: Peter Hallo, benötige ein Script für : wenn cd p: falsch dann start explorer.exe p: bin 72 Lenze und kapiere nicht mehr alles. LG Peter
User: Allwissender Hey, falls ihr etwas im AD machen möchtet benötigt ihr die Powershell Version mit AD Modulen ;) MfG
User: ay1965 Hallo, ich soll ein Script schreiben . Mit dem Script soll eine Oberfläche erzeugt werden worin ich Drucker und PC's eingeben und zueinander zuordnen kann. Vielen Dank für jede Hilfe.
User: Tony Hallo Zusammen, habe eine kurze Frage, wie kann ich einen PS Script schreiben, und zwar folgendes; Ich habe den befehl (shutdown -r -t 0) geschrieben damit mein Server einen Neustart macht, aber dazu muss ich denn befehl so geben dass er nur den Neustart machen muss wenn kein Benutzer angemeldet ist und falls ein Benutzer angemeldet ist soll er keinen Neustart machen sondern eine Log datei erstellen welche Benutzer Angemeldet waren. Kann mir jemand hier weiterhelfen? Besten Dank
User: Lisa Gibt es eine Möglichkeit, die Uefi-Firmware in der Powershell zu konfigurieren. Das, weil die Default-Einstellungen der Firmware sich nicht uneingeschränkt ändern lassen. vor allem lässt sich CSM nicht auf Enabled setzen. Damit ließe sich Windows nicht selbst von außen reparieren (PCW-Notfallsystem u. ä.)
User: Simon Hallo ich möchte ein Script schreiben, dass alle Admins in unserem System ausliest und die Passwörter zurücksetzt wie soll ich vorgehen. Ich hab viele male gelesen, dass Get-ADGroupMember zum auslesen funktionieren soll aber bei mir wird nicht einmal der Command gefunden
User: anna ich möchte ein script erstllen, dass inhalte aus einer html seite heraulesen kann und diese dann in einem monitoringsystem anzeigen lassen (PRTG).. leider habe ich mit powershell noch keine erfahrungen
User: InteressierterBeginner Fange allmlich mit Powershell an (Bedingt durch Job :P) Hat schonmal f den Anfang gelangt. Hoffe es folgen weitere Beispiele :P :P
User: interessierter Auf jeden Fall mal Danke! f die tollen Tips - mach weiter so und ich werde noch ein Fan von dir :)