Advertisement
  1. Code
  2. ASP.NET

Begrüßen Sie PowerShell

Scroll to top
Read Time: 12 min

() 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.


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!

Advertisement
Did you find this post useful?
Want a weekly email summary?
Subscribe below and we’ll send you a weekly email summary of all new Code tutorials. Never miss out on learning about the next big thing.
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.