Powershell installieren oder updaten


1 Betriebssysteme

1.1 Windows 7/ Server 2008

Update von Powershell V2 auf V3

Beachtet auch die Installationsvoraussetzungen für Powershell V3.0 (Windows 7 SP1, Windows Server 2008 R2 SP1, and Windows Server 2008 SP2). Für eine Powershell V3 Installation auf Windows7 / Server 2008 muss auch das .Net 4.0 - Paket installiert sein, sonst erhält man immer die Meldung, dass "dieses Update nicht für diesen Computer geeignet ist"

Die benötigten Daten zur Auswahl desr richtigen Paketes kann man sich mit der Powershell V2.0 oder auch von der Commandline einfach besorgen

 

Beispiel 1: Eigenschaften des Betriebssystems

Get-WmiObject Win32_Operatingsystem | Select Version, OSArchitecture | Format-List
#mögliche Ausgabe

Version        : 6.1.7601
OSArchitecture : 64-Bit

 

In der Commandline liefert "WMIC OS Get * /Value" ebenfalls diese Werte

Kommt es bei der Installation zu Fehlern, etwa das das Hotfix nicht für diese Betriebssystemversion geeignet ist, so fehlt eventuell das aktuelle .Net-Paket 4
Microsoft: Microsoft .NET Framework 4 (Webinstaller)

 

Beispiel 2: Bestimmen der installierten .Net Versionen

Set-StrictMode -Version "2.0"
Clear-Host

gci $env:Windir\Microsoft.Net\framework | Where {$_.Mode -match "d"} | ft -auto
#mögliche Ausgabe

   Verzeichnis: C:\Windows\Microsoft.Net\framework


Mode         LastWriteTime Length Name      
----         ------------- ------ ----      
d---- 14.07.2009     19:58        1031      
d---- 09.02.2013     16:11        v1.0.3705
d---- 14.07.2009     05:20        v1.1.4322
d---- 10.02.2013     09:14        v2.0.50727
d---- 14.07.2009     19:58        v3.0      
d---- 10.02.2013     00:36        v3.5      
d---- 10.02.2013     23:16        v4.0.30319

Nach einem Reboot steht die Powershell V3.0 bereit. Als einen der ersten Schritte lohnt sich das cmdlet "update-help" mit Administratorrechten aufzurufen. Dadurch wird die Powershellhilfe auf dem System installiert/ aktualisiert.

 

 

1.2 Windows 2012

Auf einem Windows2012-Server ist die Powershell_V3 default installiert. Ruft man ein cmdlet aus dem ActiveDirectory-Module auf, so wird beim ersten Mal das Modul automatisch nachinstalliert. Dies geschieht so schnell, dass man höchstens ein kurzes Aufblinken von ein paar Fehlermeldungen im Hintergrunden wahrnimmt.
 

1.3 Windows 8

Auch auf Windows8 ist die Powershell_V3 default installiert. Um allerdings das ActiveDirectory-Module benutzen zu können, muss man erst die RSAT-Tools für Windows8 herunterladen und installieren

Download Center: Remoteserver-Verwaltungstools für Windows 8 (KB2693643)

Die Installation der Updates dauert einige Minuten.

Ebenso wie bei Windows2012 ist kein extra Modulimport (Import-Module ActiveDirectory) mehr notwendig. Der Aufruf eines cmdlets aus einem noch nicht importierten Moduls führt automatisch zur Installation desselbigen.

 

2 Was gibts Neues in Powershell V3

Technet: What's New in Windows PowerShell 3.0


Beispiel 1: $_ bekommt einen Alias

Wer sich schon länger mit der Powershell beschäftigt hat, für den sind Filter  mit "Where{$_.xxx  xxxxx}" selbstverständlich, um sich beispielsweise nur die Eigenschaften des logischen Laufwerks C: anzuzeigen.

#Powershell V2.0/ V3.0
Get-WmiObject Win32_Logicaldisk | Where{$_.DeviceID -eq 'C:'}

Von einem Neuling, oder einem Gelegenheitsskripter erfordert diese Syntax aber einige Gewöhnung.

Mit Powershell 3.0 lässt die Syntax für das Filtern nach der Pipe vereinfachen:


Anstelle von $_ kann man nun das etwas weniger kryptische "$PSItem" nutzen

#Powershell V3.0
Get-WmiObject Win32_Logicaldisk | Where{$PSItem.DeviceID -eq 'C:'}

Das ist schon verständlicher, aber bei Weitem noch nicht das Ende, zumindest bei einfachen Scriptblocks


Wir können bei gleicher Funktionalität "$PSItem", sowie die geschweiften Klammern einfach weglassen

#Powershell V3.0
Get-WmiObject Win32_Logicaldisk | Where DeviceID -eq 'C:'

Diese Syntax ist im Vergleich zum oberen Beispiel nahezu selbsterklärend.

ABER:
Für komplexere Scriptblocks mit mehreren Operatoren wie -Or und -Like kommt man um die geschweiften Klammer und $_/$PSItem doch nicht herum

Get-WmiObject Win32_Logicaldisk | Where {$PSitem.DriveType -eq '3' -and $_.Size -gt 75GB}


Erklärung zur Pipe und Where: Links von der Pipe werden Objekte erzeugt, die nur dann ausgegeben werden, wenn der Scriptblock zwischen den beiden geschweiften Klammern ein $true ergibt.

Get-WmiObject Win32_Logicaldisk | Where {$true} #gibt alles aus


Beispiel 2a: Anzeigen aller Unterordner mit PSH V2.0 und PSISContainer

Hier gleich die nächste Kosmetik

#Powershell V2.0

$Path="c:\temp\homes\"

Get-ChildItem -Path $Path|Where{$_.PSISContainer}
# Get-ChildItem -Path $Path|Where{($_.Attributes -Match [System.IO.FileAttributes]::Directory)}
# Get-ChildItem -Path $Path|Where{$_.Mode -Match "d"}

siehe 2.1.3.1 Attribute von Verzeichnissen und Dateien -> Beispiel 5a

Mit der Property "$_.PSISContainer" kann man gut unterscheiden, ob die ausgegeben Objekte einen Container darstellen oder nicht. Ganz leicht zu verstehen ist diese Eigenschaft aber nicht. Mit Powershell V3.0 kann man die Unterscheidung nach Dateien und Ordnern viel eleganter schreiben, wie im nächsten Beispiel gezeigt.

Mit Powershell V3.0 hat Get-ChildItem die Parameter -Directory und -File bekommen, die ein Filtern der Ausgabe auf Verzeichnisse oder Dateien vereinfacht.


Beispiel 2b: Anzeigen aller Unterordner mit PSH V3.0

#Powershell V3.0

$Path="c:\temp\homes\"
Get-ChildItem -Path $Path -Directory

 

Beispiel 3: die updatebare lokale Onlinehilfe

Bei der Standardinstallation wird nur ein kleiner Teil der aus Powershell V1.0 und V2.0 gewohnten Onlinehilfe installiert. Der Aufruf von "Get-Help <cmdlet>" gibt nur die Syntax des cmdlets zurück.
Ist der Rechner mit dem Internet verbunden, erhält man mit dem cmdlet "Update-Help" die aktuelle Hilfeversion. 
Die aktualisierte Hilfe seines Clients kann man mit dem cmdlet "Save-Help" auf ein Share sichern und damit andere Rechner, die über keine Internetverbindung verfpgen, mittels "Update-Help" versorgen:

Bei mir funktioniert dieses Verfahren leider noch nicht korrekt. Das mag aber noch an meiner verwendeten Sprachversion (DE-DE) und dem Betastatus von Powershell V3.0 liegen.

Drei Vorteile bringt dieses Konzept mit sich:

- Powershell V3.0 wird sicherlich einige Jahre aktuell bleiben. Microsoft wird die Hilfe in dieser Zeit anpassen und verbessern. Mit "Update-Help" hält man die lokale Hilfe immer auf dem neuesten Stand

- Auf allen Windows Hosts der Zukunft wird Powershell ein zentraler Bestandteil sein, dennoch ist nicht auf all diesen Hosts eine Onlinehilfe notwendig. 

- Auch andere Sprachversionen der Hilfedateien sind möglich. Es gibt immer Programmierer, die lieber eine deutsche Hilfe auf ansonsten englischen Systemen nutzen wollen, wie auch umgekehrt Personen, die eine englische Hilfe auf ansonsten deutschen Systemen bevorzugen. 


Beispiel 4: Get-Command mit neuem Parameter "-Parametername"

Das cmdlet "Get-Command" hat einen neuen Positionsparameter bekommen, mit dem sich cmdlets nach bestimmten Parametern filtern lassen

#Powershell V3.0

Get-Command -ParameterName Computername

#Ausgabe gekürzt

CommandType     Name 
-----------     ----
Cmdlet          Add-Computer
Cmdlet          Clear-EventLog
Cmdlet          Connect-PSSession

Dadurch lassen sich die cmdlets herausfinden, mit denen sich besonders einfach Remotemaschinen verwalten lassen.

 

#Powershell V3.0 auf Windows7

(Get-Command -ParameterName Computername | Measure).Count
#Ausgabe
34

Auf einem nativen Windows7-System mit Powershell V3 (PreRelease) sind das immerhin schon 34 cmdlets

 

Beispiel 5: Die Klasse OrderedDictionary (Hashtables)

Set-StrictMode -Version "3.0"

$Hash1=@{a=1;b=2;c=3}
$Hash1
$Hash1.gettype() | select name
"#" * 40 + "`n"

$Hash2=@{a=1;b=2;c=3}
$Hash2.GetEnumerator() | Sort-Object name
$Hash2.gettype() | select name
"#" * 40 + "`n"

$Hash3=[ordered]@{a=1;b=2;c=3} #ab Powershell 3.0 möglich
$Hash3
$Hash3.gettype() | select name
"#" * 40 + "`n"
#getestest mit Powershell V3.0#Ausgabe

Name                        Value                              
----                           -----                              
c                              3
a                              1
b                              2

Name : Hashtable

########################################

a                              1
b                              2
c                              3

Name : Hashtable

########################################

a                              1
b                              2
c                              3

Name : OrderedDictionary

########################################


Name : OrderedDictionary


Unter Powershell V2 konnte man sich nicht darauf verlassen, dass ein Hastable so gespeichert und in der Reihenfolge ausgegeben wurde, in der er auch eingegeben wurde.
Das dritte Beispiel "$Hash3=[ordered]@{a=1;b=2;c=3}" ist erst ab Powershell V3.0 verfügbar.


Beispiel 6: Emails mit gmail versenden (send-mailmessage)

#PSTip Sending emails using your Gmail account