PowerShell Tutorial
Erste Schritte mit PowerShell
Suche…
Bemerkungen
Windows PowerShell ist eine Shell- und Skriptkomponente des Windows Management Framework, eines Frameworks zur Automatisierung / Konfiguration von Microsoft, das auf .NET Framework basiert. PowerShell wird standardmäßig auf allen unterstützten Versionen von Windows-Client- und -Serverbetriebssystemen seit Windows 7 / Windows Server 2008 R2 installiert. Powershell kann jederzeit durch Herunterladen einer späteren Version von Windows Management Framework (WMF) aktualisiert werden. Die "Alpha" -Version von PowerShell 6 ist plattformübergreifend (Windows, Linux und OS X) und muss von dieser Versionsseite heruntergeladen und installiert werden.
Zusätzliche Ressourcen:
- MSDN-Dokumentation: https://msdn.microsoft.com/de-de/powershell/scripting/powershell-scripting
- TechNet: https://technet.microsoft.com/en-us/scriptcenter/dd742419.aspx
- PowerShell Gallery: https://www.powershellgallery.com/
- MSDN-Blog: https://blogs.msdn.microsoft.com/powershell/
- Github: https://github.com/powershell
- Community Site: http://powershell.com/cs/
Versionen
Ausführung | In Windows enthalten | Anmerkungen | Veröffentlichungsdatum |
---|---|---|---|
1,0 | XP / Server 2008 | 2006-11-01 | |
2,0 | 7 / Server 2008 R2 | 2009-11-01 | |
3,0 | 8 / Server 2012 | 2012-08-01 | |
4,0 | 8.1 / Server 2012 R2 | 2013-11-01 | |
5,0 | 10 / Server 2016 Tech Preview | 2015-12-16 | |
5.1 | 10 Jubiläumsausgabe / Server 2016 | 2017-01-27 |
Installation oder Setup
Windows
PowerShell ist im Windows Management Framework enthalten. Installation und Setup sind in modernen Windows-Versionen nicht erforderlich.
Aktualisierungen an PowerShell können durch Installieren einer neueren Version von Windows Management Framework durchgeführt werden.
Andere Plattformen
Die "Beta" -Version von PowerShell 6 kann auf anderen Plattformen installiert werden. Die Installationspakete sind hier verfügbar.
Beispielsweise wird PowerShell 6 für Ubuntu 16.04 veröffentlicht, um Repositorys für eine einfache Installation (und Updates) zu verpacken.
Um zu installieren, führe folgendes aus:
# Import the public repository GPG keys curl https://packages.microsoft.com/keys/microsoft.asc | sudo apt-key add - # Register the Microsoft Ubuntu repository curl https://packages.microsoft.com/config/ubuntu/16.04/prod.list | sudo tee /etc/apt/sources.list.d/microsoft.list # Update apt-get sudo apt-get update # Install PowerShell sudo apt-get install -y powershell # Start PowerShell powershell
Nachdem Sie das Microsoft-Repository einmal als Superuser registriert haben, müssen Sie nur noch sudo apt-get upgrade powershell
, um es zu aktualisieren. Dann einfach powershell
laufen powershell
Lassen Sie auf Ihrem Computer gespeicherte Skripts nicht signiert ausgeführt werden
Aus Sicherheitsgründen ist PowerShell standardmäßig so eingerichtet, dass nur signierte Skripts ausgeführt werden können. Wenn Sie den folgenden Befehl ausführen, können Sie unsignierte Skripts ausführen (dazu müssen Sie PowerShell als Administrator ausführen).
Set-ExecutionPolicy RemoteSigned
Eine andere Möglichkeit, PowerShell-Skripts auszuführen, ist die Verwendung von Bypass
als ExecutionPolicy
:
powershell.exe -ExecutionPolicy Bypass -File "c:\MyScript.ps1"
Oder von Ihrer vorhandenen PowerShell-Konsole oder ISE-Sitzung aus, indem Sie Folgendes ausführen:
Set-ExecutionPolicy Bypass Process
Eine temporäre Problemumgehung für die Ausführungsrichtlinie kann auch erreicht werden, indem die ausführbare Powershell-Datei ausgeführt wird und eine gültige Richtlinie als Parameter -ExecutionPolicy
wird. Die Richtlinie ist nur während der Prozessdauer gültig, sodass kein Administratorzugriff auf die Registrierung erforderlich ist.
C:\>powershell -ExecutionPolicy RemoteSigned
Es stehen mehrere andere Richtlinien zur Verfügung, und Websites empfehlen oft die Verwendung von Set-ExecutionPolicy Unrestricted
. Diese Richtlinie bleibt gültig, bis sie geändert wird, und verringert die Sicherheit des Systems. Dies ist nicht ratsam. Die Verwendung von RemoteSigned
wird empfohlen, da lokal gespeicherter und geschriebener Code möglich ist und der RemoteSigned
Code mit einem Zertifikat eines vertrauenswürdigen RemoteSigned
signiert werden muss.
Beachten Sie auch, dass die Ausführungsrichtlinie möglicherweise durch Gruppenrichtlinien erzwungen wird, sodass Gruppenrichtlinien diese Einstellung möglicherweise selbst dann ändern, wenn sie in systemweit Unrestricted
geändert wird (in der Regel 15 Minuten). Sie können die Ausführungsrichtlinie sehen, die in den verschiedenen Bereichen mithilfe von Get-ExecutionPolicy -List
TechNet-Dokumentation:
Set-ExecutionPolicy
about_Execution_Policies
Aliase und ähnliche Funktionen
In PowerShell gibt es viele Möglichkeiten, um dasselbe Ergebnis zu erzielen. Dies lässt sich gut mit dem einfachen und bekannten Hello World
Beispiel veranschaulichen:
Write-Host
:
Write-Host "Hello World"
Mit Write-Output
:
Write-Output 'Hello world'
Es ist erwähnenswert, dass, obwohl Write-Output
und Write-Host
beide auf den Bildschirm schreiben, ein geringfügiger Unterschied besteht. Write-Host
schreibt nur in stdout (dh den Konsolenbildschirm), wohingegen Write-Output
sowohl in stdout AND als auch in den output [success] Write-Output
schreibt, um eine Umleitung zu ermöglichen . Die Umleitung (und Streams im Allgemeinen) ermöglicht die Ausgabe eines Befehls als Eingabe an einen anderen Befehl, einschließlich der Zuordnung zu einer Variablen.
> $message = Write-Output "Hello World"
> $message
"Hello World"
Diese ähnlichen Funktionen sind keine Aliasnamen, können jedoch zu den gleichen Ergebnissen führen, wenn der Erfolgsstrom nicht "verschmutzt" werden soll.
Write-Output
wird auf Echo
oder Write
Echo 'Hello world'
Write 'Hello world'
Oder indem Sie einfach "Hallo Welt" eingeben!
'Hello world'
All dies führt zu der erwarteten Konsolenausgabe
Hello world
Ein anderes Beispiel für Aliasnamen in PowerShell ist die übliche Zuordnung sowohl älterer Eingabeaufforderungsbefehle als auch BASH-Befehle zu PowerShell-Cmdlets. Alle folgenden Elemente erzeugen eine Verzeichnisliste des aktuellen Verzeichnisses.
C:\Windows> dir
C:\Windows> ls
C:\Windows> Get-ChildItem
Schließlich können Sie mit dem Cmdlet Set-Alias einen eigenen Alias erstellen. Als Beispiel wollen wir alisas Test-NetConnection
, die im Wesentlichen die PowerShell ist, die dem Ping-Befehl der Eingabeaufforderung entspricht, als "Ping" bezeichnen.
Set-Alias -Name ping -Value Test-NetConnection
Jetzt können Sie ping
anstelle von Test-NetConnection
! Beachten Sie, dass Sie die Zuordnung überschreiben, wenn der Alias bereits verwendet wird.
Der Alias bleibt aktiv, bis die Sitzung aktiv ist. Wenn Sie die Sitzung schließen und versuchen, den Alias auszuführen, den Sie in Ihrer letzten Sitzung erstellt haben, funktioniert er nicht. Um dieses Problem zu beheben, können Sie alle Aliase aus einer Excel-Datei einmal in Ihre Sitzung importieren, bevor Sie mit der Arbeit beginnen.
Die Pipeline - Verwenden der Ausgabe eines PowerShell-Cmdlets
Eine der ersten Fragen, die Benutzer bei der Verwendung von PowerShell für die Skripterstellung haben, ist das Ändern der Ausgabe eines Cmdlets, um eine andere Aktion auszuführen.
Das Pipeline-Symbol |
wird am Ende eines Cmdlets verwendet, um die exportierten Daten zu übernehmen und dem nächsten Cmdlet zuzuführen. Ein einfaches Beispiel ist die Verwendung von Select-Object, um nur die Name-Eigenschaft einer Datei anzuzeigen, die in Get-ChildItem angezeigt wird:
Get-ChildItem | Select-Object Name
#This may be shortened to:
gci | Select Name
Durch die erweiterte Nutzung der Pipeline können wir die Ausgabe eines Cmdlets in eine foreach-Schleife leiten:
Get-ChildItem | ForEach-Object {
Copy-Item -Path $_.FullName -destination C:\NewDirectory\
}
#This may be shortened to:
gci | % { Copy $_.FullName C:\NewDirectory\ }
Beachten Sie, dass das obige Beispiel die automatische Variable $ _ verwendet. $ _ ist der kurze Alias von $ PSItem, einer automatischen Variablen, die das aktuelle Element in der Pipeline enthält.
Kommentieren
Um Kommentare zu Energieskripten zu kommentieren, indem Sie die Zeile mit dem #
(Hash) -Symbol voranstellen
# This is a comment in powershell
Get-ChildItem
Sie können auch mehrzeilige Kommentare mit <#
und #>
am Anfang und Ende des Kommentars einfügen.
<#
This is a
multi-line
comment
#>
Get-ChildItem
.Net-Bibliotheksmethoden aufrufen
Statische .Net-Bibliotheksmethoden können von PowerShell aus aufgerufen werden, indem der vollständige Klassenname in der dritten Klammer gekapselt wird und die Methode dann aufgerufen wird ::
#calling Path.GetFileName()
C:\> [System.IO.Path]::GetFileName('C:\Windows\explorer.exe')
explorer.exe
Statische Methoden können von der Klasse selbst aufgerufen werden. Für den Aufruf nicht statischer Methoden ist jedoch eine Instanz der .Net-Klasse (ein Objekt) erforderlich.
Beispielsweise kann die AddHours-Methode nicht von der System.DateTime-Klasse selbst aufgerufen werden. Es erfordert eine Instanz der Klasse:
C:\> [System.DateTime]::AddHours(15)
Method invocation failed because [System.DateTime] does not contain a method named 'AddHours'.
At line:1 char:1
+ [System.DateTime]::AddHours(15)
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidOperation: (:) [], RuntimeException
+ FullyQualifiedErrorId : MethodNotFound
In diesem Fall erstellen wir zuerst ein Objekt , zum Beispiel:
C:\> $Object = [System.DateTime]::Now
Dann können wir Methoden dieses Objekts verwenden, auch Methoden, die nicht direkt von der System.DateTime-Klasse aufgerufen werden können, wie die AddHours-Methode:
C:\> $Object.AddHours(15)
Monday 12 September 2016 01:51:19
Objekte erstellen
Das Cmdlet New-Object
wird zum Erstellen eines Objekts verwendet.
# Create a DateTime object and stores the object in variable "$var"
$var = New-Object System.DateTime
# calling constructor with parameters
$sr = New-Object System.IO.StreamReader -ArgumentList "file path"
In vielen Fällen wird ein neues Objekt erstellt, um Daten zu exportieren oder an ein anderes Commandlet zu übergeben. Dies kann wie folgt gemacht werden:
$newObject = New-Object -TypeName PSObject -Property @{
ComputerName = "SERVER1"
Role = "Interface"
Environment = "Production"
}
Es gibt viele Möglichkeiten, ein Objekt zu erstellen. Die folgende Methode ist wahrscheinlich die kürzeste und schnellste Möglichkeit, ein PSCustomObject
zu erstellen:
$newObject = [PSCustomObject]@{
ComputerName = 'SERVER1'
Role = 'Interface'
Environment = 'Production'
}
Wenn Sie bereits über ein Objekt verfügen, aber nur eine oder zwei zusätzliche Eigenschaften benötigen, können Sie diese Eigenschaft einfach mit Select-Object
hinzufügen:
Get-ChildItem | Select-Object FullName, Name,
@{Name='DateTime'; Expression={Get-Date}},
@{Name='PropertieName'; Expression={'CustomValue'}}
Alle Objekte können in Variablen gespeichert oder in die Pipeline übergeben werden. Sie können diese Objekte auch zu einer Sammlung hinzufügen und dann die Ergebnisse am Ende anzeigen.
Sammlungen von Objekten funktionieren gut mit Export-CSV (und Import-CSV). Jede Zeile der CSV ist ein Objekt, jede Spalte eine Eigenschaft.
Formatierungsbefehle konvertieren Objekte in einen Textstrom zur Anzeige. Vermeiden Sie die Verwendung von Format- * -Befehlen bis zum letzten Schritt der Datenverarbeitung, um die Verwendbarkeit der Objekte zu erhalten.