PowerShellErste Schritte mit PowerShell


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:

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

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.

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

.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
 

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
 

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.

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

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.