() translation by (you can also view the original English article)
PowerShell befindet sich seit über zehn Jahren in der Entwicklung. Microsoft investiert weiterhin in seine Entwicklung und Einführung. Diese Investitionen haben die Leichtigkeit und Robustheit verändert, mit der Entwickler und Administratoren Windows-Aufgaben automatisieren können.
Was ist PowerShell?
PowerShell löst Administrations- und Anpassungsprobleme durch die nahtlose Integration von .NET Framework.
PowerShell ist das Task-Automatisierungsframework von Microsoft, das aus einer Befehlszeilen-Shell, einer integrierten Skriptumgebung (ISE), einer auf .NET Framework basierenden Skriptsprache und einer API besteht, mit der Sie PowerShell in Ihren .NET-Anwendungen hosten können Automatisierungsplattform. PowerShell bietet vollständigen Zugriff auf COM und WMI, sodass Sie Aufgaben sowohl auf lokalen als auch auf Remote-Windows-Systemen ausführen können.
PowerShell ist eine neue Plattform für die Automatisierung, bei der Administrations- und Anpassungsprobleme durch die nahtlose Integration von .NET Framework gelöst werden. Es ist gut für Entwickler, Administratoren, Tester und mehr. Basierend auf .NET senkt das Werkzeug die Kosten und bietet Entwicklern und Administratoren eine einfache und unternehmensfähige Möglichkeit, alle Prozesse zu automatisieren, zu messen und zu verbessern.
Folgen Sie entlang
In diesem Intro werde ich einige der Tiefen und Breiten hervorheben, die PowerShell auf den Tisch bringt. Dinge wie die bahnbrechende Objektpipeline, die REPL (Lesen, Auswerten, Druckschleife), die .NET-Integration und vieles mehr.
Wenn Sie Windows 7 oder 8 ausführen, ist PowerShell bereits installiert. Laden Sie hier PowerShell v3 für Windows 7 herunter. Sie benötigen Windows 7 SP1 und das Herunterladen funktioniert auch für Windows 2008 R2 SP1 und Windows 2008 SP2. Wenn Sie Vista, XP oder Windows 2003 ausführen, müssen Sie sich hier mit PowerShell v2 zufrieden geben.
Wozu ist es gut? Absolut alles!
Von der Bereitstellung mehrerer Ressourcen in Azure über die Verwaltung Ihrer Software-Builds für die kontinuierliche Integration bis hin zum Zugriff auf Webdienste oder REST-Endpunkte. PowerShell bietet Ihnen alles und bietet noch viel mehr.
- Schneiden, würfeln Sie Text, XML, CSV und JSON mit Leichtigkeit
- Betten Sie PowerShell ein, um Skriptfunktionen für Ihre C# -Anwendungen bereitzustellen
- Erstellen Sie GUI-Anwendungen fünf- bis zehnmal schneller mit weniger Code
- Nutzen Sie die Funktionen von PowerShell für die Arbeit mit dem Internet
- Interagieren Sie mit DLLs und erstellen Sie Objekte, zeigen Sie Eigenschaften automatisch an und rufen Sie Methoden in interaktiven Live-Sitzungen auf
- Erstellen Sie domänenspezifische Sprachen (DSLs) und Vokabulare, um Lösungen klarer auszudrücken
- Arbeiten Sie mit Microsoft Office via das Component Object Model (COM).
- PowerShell v3-Funktionen
Bootstrapping von PowerShell
Was ist ein Cmdlet? Ein Cmdlet ist der grundlegende Baustein in PowerShell und wird als Verb-Nomen-Paar ausgedrückt, um sie selbstbeschreibend zu machen. Zum Beispiel:
1 |
PS C:\> Get-Date
|
2 |
|
3 |
Sunday, May 26, 2013 8:46:16 AM |
PowerShell enthält Hunderte von Kern-Cmdlets, und Sie können Ihre eigenen schreiben.
Merken Sie zwei Cmdlets
PowerShell erleichtert die Auffindbarkeit. Verwenden Sie Get-Command
, wenn Sie zum blauen Bildschirm von PowerShell gehen und sich nicht sicher sind, was Sie tun sollen.
Das Cmdlet
Get-Command
ruft alle auf dem Computer installierten Befehle ab, einschließlich Cmdlets, Aliase, Funktionen, Workflows, Filter, Skripts und Anwendungen.
Im Wesentlichen zeigt Ihnen Get-Command
alle Dinge, die Sie in der aktuellen PowerShell-Sitzung tun können.
Get-Command
Get-Command
unterstützt Platzhalter. Angenommen, ich möchte alle Cmdlets sehen, die das Verb Invoke
enthalten.
1 |
Get-Command Invoke*
|
Folgendes erhalte ich nach dem Drücken enter
.
1 |
CommandType Name ModuleName |
2 |
----------- ---- ---------- |
3 |
Function Invoke-AsWorkflow PSWorkflowUtility |
4 |
Function Invoke-Background ShowUI |
5 |
Function Invoke-BrowserControl AutoBrowse |
6 |
Function Invoke-Line isepack |
7 |
Function Invoke-Line PowerShellPack |
8 |
Function Invoke-Office365 Pipeworks |
9 |
Function Invoke-Pester Pester |
10 |
Function Invoke-WebCommand Pipeworks |
11 |
Cmdlet Invoke-CimMethod CimCmdlets |
12 |
Cmdlet Invoke-Command Microsoft.PowerShell.Core |
13 |
Cmdlet Invoke-Expression Microsoft.PowerShell.Utility |
14 |
Cmdlet Invoke-History Microsoft.PowerShell.Core |
15 |
Cmdlet Invoke-Item Microsoft.PowerShell.Management |
16 |
Cmdlet Invoke-RestMethod Microsoft.PowerShell.Utility |
17 |
Cmdlet Invoke-TroubleshootingPack TroubleshootingPack |
18 |
Cmdlet Invoke-WebRequest Microsoft.PowerShell.Utility |
19 |
Cmdlet Invoke-WmiMethod Microsoft.PowerShell.Management |
20 |
Cmdlet Invoke-WSManAction Microsoft.WSMan.Management |
Was sind die Cmdlets, die mit dem Substantiv Item enden?
1 |
Get-Command *-Item |
Beachten Sie, dass Sie andere Verben wie Löschen, Neu, Entfernen und Festlegen sehen.
1 |
CommandType Name ModuleName |
2 |
----------- ---- ---------- |
3 |
Cmdlet Clear-Item Microsoft.PowerShell.Management |
4 |
Cmdlet Copy-Item Microsoft.PowerShell.Management |
5 |
Cmdlet Get-Item Microsoft.PowerShell.Management |
6 |
Cmdlet Invoke-Item Microsoft.PowerShell.Management |
7 |
Cmdlet Move-Item Microsoft.PowerShell.Management |
8 |
Cmdlet New-Item Microsoft.PowerShell.Management |
9 |
Cmdlet Remove-Item Microsoft.PowerShell.Management |
10 |
Cmdlet Rename-Item Microsoft.PowerShell.Management |
11 |
Cmdlet Set-Item Microsoft.PowerShell.Management |
Als Nächstes werde ich einige Cmdlets verwenden, um zusammenzufassen, was in meiner Sitzung auf einer meiner Boxen verfügbar ist, wenn ich die PowerShell-Konsole starte.
1 |
Get-Command | Group CommandType -NoElement | Sort Count -Descending |
Ich rufe Get-Command
auf, gruppiere es und sortiere es. Hier kann ich sehen, dass ich über 1000 Cmdlets habe, mit denen ich arbeiten kann. Ich verwende PowerShell v3 mit zusätzlichen installierten Modulen, sodass Ihr Kilometerstand variieren kann.
1 |
Count Name |
2 |
----- ---- |
3 |
2487 Function |
4 |
1184 Cmdlet |
5 |
38 Alias |
6 |
1 Filter |
Aus welchen Modulen stammen diese Cmdlets? Wir können diese Frage folgendermaßen beantworten:
1 |
Get-Command -CommandType Cmdlet | Group ModuleName -NoElement | Sort Count -Descending |
Mit PowerShell kann ich viel erreichen.
1 |
Count Name |
2 |
----- ---- |
3 |
379 ShowUI |
4 |
164 Hyper-V |
5 |
157 Azure |
6 |
92 Microsoft.PowerShell.Utility |
7 |
82 Microsoft.PowerShell.Management |
8 |
78 WebAdministration |
9 |
55 Microsoft.PowerShell.Core |
10 |
22 Dism |
11 |
18 International |
12 |
17 PKI |
13 |
16 PSScheduledJob |
14 |
13 Microsoft.WSMan.Management |
15 |
12 CimCmdlets |
16 |
10 Microsoft.PowerShell.Security |
17 |
9 TrustedPlatformModule |
18 |
8 BitsTransfer |
19 |
8 MsDtc |
20 |
6 Pipeworks |
21 |
6 Kds |
22 |
5 AppLocker |
23 |
5 SecureBoot |
24 |
5 Microsoft.PowerShell.Diagnostics |
25 |
4 NetSecurity |
26 |
4 Appx |
27 |
3 WindowsErrorReporting |
28 |
2 Microsoft.PowerShell.Host |
29 |
2 TroubleshootingPack |
30 |
1 PSWorkflow |
31 |
1 DnsClient |
Get-Help
Get-Help
macht genau das. Es zeigt Hilfe für das Cmdlet an, über das Sie mehr wissen möchten. Es ist nicht nur einfach, Hilfe zu erhalten, sondern es ist auch einfach, Hilfe für die von Ihnen entwickelten Cmdlets/erweiterten Funktionen zu erstellen/einzuschließen, ein Thema für einen anderen Artikel. Hilfe an Ihren Fingerspitzen zu haben, spart viel Zeit.
1 |
Get-Help Invoke-Command |
Hier ist eine verkürzte Version der Ausgabe.
1 |
NAME |
2 |
Get-Process |
3 |
|
4 |
SYNOPSIS |
5 |
Gets the processes that are running on the local computer or a remote computer.
|
6 |
|
7 |
SYNTAX |
8 |
Get-Process [[-Name] <String[]>] [-ComputerName <String[]>] [-FileVersionInfo [<SwitchParameter>]] [-Module |
9 |
[<SwitchParameter>]] [<CommonParameters>] |
10 |
|
11 |
Get-Process [-ComputerName <String[]>] [-FileVersionInfo [<SwitchParameter>]] [-Module [<SwitchParameter>]] -Id |
12 |
<Int32[]> [<CommonParameters>]
|
13 |
|
14 |
Get-Process [-ComputerName <String[]>] [-FileVersionInfo [<SwitchParameter>]] [-Module [<SwitchParameter>]] |
15 |
-InputObject <Process[]> [<CommonParameters>] |
16 |
|
17 |
DESCRIPTION |
18 |
The Get-Process cmdlet gets the processes on a local or remote computer.
|
19 |
.
|
20 |
.
|
21 |
.
|
22 |
. |
Noch einfacher; Im Cmdlet Get-Help gibt es dafür einen Schalter, der Sie hierher führt.
1 |
Get-Help Get-Process -Online
|
Möchten Sie nur Beispiele zur Verwendung des Cmdlets sehen? Verwenden Sie den Schalter -Examples
. Außerdem können Sie das Beispiel direkt in die Konsole kopieren und einfügen und ausführen.
1 |
Get-Help Get-Process -Examples
|
So einfach und schnell geht das.
1 |
NAME |
2 |
Get-Process |
3 |
|
4 |
SYNOPSIS |
5 |
Gets the processes that are running on the local computer or a remote computer.
|
6 |
|
7 |
-------------------------- EXAMPLE 1 -------------------------- |
8 |
|
9 |
PS C:\> Get-Process
|
10 |
|
11 |
This command gets a list of all of the running processes running on the local computer. For a definition of each column, see the "Additional Notes" section of the Help topic for Get-Help. |
12 |
|
13 |
-------------------------- EXAMPLE 2 -------------------------- |
14 |
|
15 |
PS C:\> Get-Process winword, explorer | format-list * |
PowerShell funktioniert problemlos mit Webdiensten
Das W3C definiert einen "Webdienst" als:
[...] ein Softwaresystem zur Unterstützung der interoperablen Interaktion von Maschine zu Maschine über ein Netzwerk. Es verfügt über eine Schnittstelle, die in einem maschinenverarbeitbaren Format (speziell WSDL) beschrieben ist. Andere Systeme interagieren mit dem Webdienst auf eine Weise, die in seiner Beschreibung unter Verwendung von SOAP-Nachrichten vorgeschrieben ist, die normalerweise über HTTP mit einer XML-Serialisierung in Verbindung mit anderen webbezogenen Standards übermittelt werden.
PowerShell erledigt Web Services mithilfe des Cmdlets New-WebServiceProxy
schnell. Ändern Sie die $zipcode
, führen Sie sie aus und erhalten Sie die neuesten Wetterinformationen.
1 |
$zipCode = "96826" |
2 |
|
3 |
$svc = New-WebServiceProxy http://wsf.cdyne.com/WeatherWS/Weather.asmx |
4 |
$result = $svc.GetCityForecastByZIP($zipCode) |
5 |
|
6 |
# Transform the results
|
7 |
$result.ForecastResult |
|
8 |
ForEach {
|
9 |
[PSCustomObject]@{ |
10 |
City = $result.City |
11 |
State = $result.State |
12 |
Date = $_.Date.ToString("d") |
13 |
Description = $_.Desciption |
14 |
DaytimeHigh = $_.Temperatures.DaytimeHigh |
15 |
}
|
16 |
}
|
Ergebnis
Ich speichere das Proxy-Objekt in $svc
und rufe dann die GetCityForecastByZIP
-Methode auf, um die Ergebnisse in $result
zu erfassen. Beim Durchlaufen des ForecastResult-Arrays transformiere ich den Datensatz in den Daten. Beachten Sie, dass sich City und DaytimeHigh in der Hierarchie auf verschiedenen Ebenen befinden.
Die von mir verwendete Technik besteht darin, Schlüssel / Wert-Paare für die Hashtabelle zu erstellen. @{}
ist die PowerShell-Syntax für eine neue Hashtabelle. Die Verwendung von [PSCustomObject]
ist ein PowerShell-Beschleuniger, mit dem ich zum einen ein benutzerdefiniertes Objekt aus einer Hashtabelle erstellen kann.
Der Weather.asmx
-Webdienst hat hierarchisches XML zurückgegeben. In einigen PowerShell-Befehlen habe ich die Daten neu gestaltet und sie (das Datum) nach meinen Wünschen formatiert. In diesem Beispiel habe ich PowerShell ausdrucken lassen. Sobald ich die Daten in meiner PowerShell-Sitzung habe, bin ich jetzt mit dem PowerShell-Ökosystem verbunden und kann dieses Array von benutzerdefinierten Objekten problemlos an andere Cmdlets weiterleiten, um sie an einen anderen Webdienst zu übertragen, HTML zu generieren, in einer Datei zu speichern und eine CSV zu erstellen Datei oder exportieren Sie es in eine SQL-Datenbank.
1 |
City State Date Description DaytimeHigh |
2 |
---- ----- ---- ----------- ----------- |
3 |
Honolulu HI 5/22/2013 Showers 76 |
4 |
Honolulu HI 5/23/2013 Partly Cloudy 76 |
5 |
Honolulu HI 5/24/2013 Partly Cloudy 77 |
6 |
Honolulu HI 5/25/2013 Partly Cloudy 77 |
7 |
Honolulu HI 5/26/2013 Partly Cloudy 77 |
8 |
Honolulu HI 5/27/2013 Partly Cloudy 77 |
9 |
Honolulu HI 5/28/2013 Partly Cloudy 77 |
Mit CSV, JSON und XML arbeiten
Das Schneiden und Würfeln von Textformaten ist ein PowerShell-Sweetspot. Hier konvertiere ich drei gängige Formate in ein PowerShell-Objekt. Für CSV und JSON verwende ich die richtigen ConvertFrom-*
Cmdlets, und für XML verwende ich den
Beschleuniger, der XML verwendet und ein XMLDocument erstellt.
1 |
# Use CSV
|
2 |
$csv = "Name,Age`r`nJohn,10" | ConvertFrom-Csv |
3 |
$csv
|
4 |
|
5 |
Name Age |
6 |
---- --- |
7 |
John 10 |
8 |
|
9 |
# Use JSON
|
10 |
$json = "{Name:'Tom', Age:20}" | ConvertFrom-Json |
11 |
$json
|
12 |
|
13 |
Name Age |
14 |
---- --- |
15 |
Tom 20 |
16 |
|
17 |
# Use XML
|
18 |
$xml = ([xml][/xml]"<data><record><Name>Harry</Name><Age>30</Age></record></data>").data.record |
19 |
$xml
|
20 |
|
21 |
Name Age |
22 |
---- --- |
23 |
Harry 30 |
24 |
|
25 |
# Combine all three
|
26 |
$csv,$json,$xml |
27 |
|
28 |
Name Age |
29 |
---- --- |
30 |
John 10 |
31 |
Tom 20 |
32 |
Harry 30 |
33 |
|
34 |
# Add up the ages
|
35 |
$csv,$json,$xml | % {$sum=0} {$sum+=$_.age} {$sum} |
36 |
|
37 |
60 |
Wir haben also drei heterogene Formate verwendet und am Ende eine Aggregation über eines der Felder durchgeführt. Ich hätte jeden dieser Datenfeeds von verschiedenen Orten abrufen können, die CSV von einer Netzwerkfreigabe, den JSON für eine REST-Abfrage und das XML von einem Webdienst. Wie gesagt, dies ist ein PowerShell-Sweetspot.
Twitter-Suche
Verwenden wir die Such-REST-API von Twitter in der Befehlszeile. Ich erstelle die URL, die Sie in Ihrem Browser verwenden können, und verwende dann das PowerShell-Cmdlet Invoke-RestMethod
. Es sendet eine Anforderung an den REST-Service und ermittelt, ob die Antwort XML oder JSON ist. Hier fordere ich eine JSON-Antwort an, damit Invoke-RestMethod
die Ergebnisse in ein Array von PowerShell-Objekten konvertiert. Ich leite sie an das Cmdlet Select
(ein Alias des Verb-Nomen Select-Object
) weiter und wähle nur drei Felder aus. Stellen Sie sich dies als eine Projektion vor, ähnlich wie bei LINQ oder SQL.
1 |
$query = "PowerShell" |
2 |
$url = "http://search.twitter.com/search.json?q=$query" |
3 |
|
4 |
(Invoke-RestMethod $url).results | |
5 |
Select created_at, from_user_name, text |
Ergebnis
So einfach ist das. Schauen Sie sich ein Video an, das ich für Version 2 gemacht habe: "PowerShell, ShowUI und die Twitter-API". Eine Mini-WPF-Twitter-App in einer Handvoll PowerShell.
1 |
created_at from_user_name text |
2 |
---------- -------------- ---- |
3 |
Sat, 25 May 2013 vitor pombeiro @brunomlopes a falar sobre Powershell "Ã minha maneira" |
4 |
Sat, 25 May 2013 Jeffery Hicks Did you know the #PowerShell ISE has startup options? In |
5 |
Sat, 25 May 2013 Pat Richard @mwjcomputing Yeah - had always used $MyInvocation.MyCom |
6 |
Sat, 25 May 2013 Rob Fairman "#PowerShell Script for Clearing #Windows Event Logs" ht |
7 |
Sat, 25 May 2013 Jim Priestley Automating SharePoint Deployments in Windows #Azure usin |
8 |
Sat, 25 May 2013 VT Technology RT @jangwoo_park: “@VTTechnology: Export Multiple Virtua |
9 |
Sat, 25 May 2013 Aryan Nava Using PowerShell to view Site created on the previous da |
10 |
Sat, 25 May 2013 Aryan Nava PowerShell Tips for SQL Server http://t.co/lVW2AY5BYZ |
11 |
Sat, 25 May 2013 Private Cloud Tech The Journey to the Private Cloud Part 3 – The Infrastruc |
12 |
Sat, 25 May 2013 Dr Tom Shinder The Journey to the Private Cloud Part 3 – The Infrastruc |
13 |
Sat, 25 May 2013 Jacob Daniels RT @tech_faq: Windows Server Manager is based on Windows |
14 |
Sat, 25 May 2013 CodeCruiser 10 Tips for the SQL Server PowerShell Scripter http://t. |
Kompilieren von C# im laufenden Betrieb in PowerShell
PowerShell ist eine interpretierte Sprache. Es wird also eine Strafe geben. Es ist kein großes Problem, aber manchmal benötigen Sie die Geschwindigkeit einer kompilierten Sprache. Mit PowerShell können Sie C# im laufenden Betrieb in Ihrer PowerShell-Sitzung mithilfe des Parameters -TypeDefinition
im Cmdlet Add-Type
kompilieren. Beachten Sie die here-string
, identifiziert durch die @" "@
. Sie sind sehr nützlich, wenn Sie Text zitieren. Ich empfehle Ihnen, mehr über die Angebotsregeln von Add-Type
und PowerShell zu erfahren.
1 |
Add-Type -TypeDefinition @" |
2 |
public class TestInline
|
3 |
{
|
4 |
public long Fibonacci(long n)
|
5 |
{
|
6 |
long a = 0;
|
7 |
long b = 1;
|
8 |
|
9 |
for (long idx = 0; idx < n; idx+=1)
|
10 |
{
|
11 |
long temp = a;
|
12 |
a = b;
|
13 |
b = temp + b;
|
14 |
}
|
15 |
return a;
|
16 |
}
|
17 |
}
|
18 |
"@
|
19 |
|
20 |
$obj = New-Object TestInline |
21 |
|
22 |
1..10 | ForEach { $obj.Fibonacci($_) } |
Interaktion mit DLLS
Nehmen wir an, ich habe Ihnen nicht den Quellcode gegeben - nur die kompilierte DLL. Kein Problem: Add-Type
hat einen -Path
-Parameter.
1 |
Add-Type -Path .\FibLib.dll |
2 |
|
3 |
$obj = New-Object TestInline |
4 |
1..10 | ForEach { $obj.Fibonacci($_) } |
Achten Sie besonders darauf. Wenn Sie Add-Type
auf diese Weise verwenden, können Sie jede .NET-DLL, die von jemandem stammt, einfach umbrechen, wenn dieser noch keine PowerShell-Schnittstelle bereitgestellt hat. Dies gilt unabhängig davon, ob die DLL von Microsoft, DELL, Citrix oder einem anderen Entwickler stammt.
Zum Schluss
Das macht es also erstmal. Möchten Sie mehr Powershell-spezifische Inhalte auf Nettuts+ sehen? Lasse Sie es uns unten wissen!