Windows PowerShell: Skripting-Intensivkurs

Die ausführliche Windows PowerShell-Kolumne vermittelt Ihnen unverzüglich noch mehr Wissen über diese leistungsstarke Technologie.

Don Jones

Mehr von Ihnen sind immer verwendet, um Windows PowerShell und seine Vorteile realisieren.In diesem Sinne wird Artikel dieses Monats eine lange.Dies ist eine Übersicht über Lightning Windows PowerShell Skripting, wie z. B. das Erstellen von Skripts mit Parametern.In den nächsten Monaten konzentriere ich mich auf bestimmte Themen, die auf dieser Grundlage aufbauen.

Wenn Sie die Windows PowerShell-Befehle in der Konsole ausführen nicht verwendet, können Sie diese auch erweiterte Suchen, aber versuchen, auf jeden Fall durchforsten.Sie müssen ein gründliches Verständnis der Windows PowerShell-Sicherheitsfeatures.Sie sollten bereits über die Grundsätze der Auftragsausführung kennen und wissen, welche Einstellung Sie verwenden.Wenn Sie bereits wissen, dass den Unterschied zwischen "RemoteSigned" und "AllSigned" und daher besser als die anderen sein kann, Sie bereit für die folgenden Material möglicherweise nicht.

Sie sollten auch wissen, wie zum Ausführen von Skripts in der Shell und sollten bedenken, dass Sie immer einen Pfad und einen Dateinamen angeben, um ein Skript auszuführen.Schließlich sollten Sie auch die Differenz zwischen dem Ausführen eines Skripts in der Integrated Scripting Environment (ISE) und die Konsole wissen.Führen Sie Skripts in die ISE im globalen Gültigkeitsbereich.In der Konsole normale Shell erhalten Skripts ihren eigenen Gültigkeitsbereich.Ich werde Bereich überprüfen sollten, aber Sie bereits erahnen, was es bedeutet und was er bewirkt.

Wenn Sie nicht ganz schnell fühlen, werfen Sie einen Blick in meinem Buch "Erfahren Sie Windows PowerShell in einem Monat für das Mittagessen" (Manning Publications, 2011), und die Companion-Website zu sehen, ob Sie eine bessere Grundlage erstellen diese Ressourcen dazu beitragen können.

Versuchen Sie, die folgen, wie Sie diesen Artikel zu lesen.Versuchen Sie es in den Beispielen.Wenn Sie geben (oder kopieren und Einfügen) die Skriptbeispielen in der Windows PowerShell ISE ab Zeile 1, werden die Zeilennummern der Zeilennummern in den Beschreibungen entsprechen.

Windows PowerShell-Skriptdateien

Eine Windows PowerShell-Skriptdatei ist nicht mehr als eine nur-Text-Datei, die ein.Ps1-Dateinamenerweiterung.Die "1" bezieht sich nicht auf die Version des Windows PowerShell, sondern vielmehr die Version der Language-Engine.Windows PowerShell Version 1 und 2 verwenden Language Engine Version 1.Deshalb sind beide Versionen der Schale in einen Ordner "V1. 0" unter \Windows\System32\WindowsPowerShell installiert.

Ein Windows PowerShell-Skript ist nicht genau wie eine Befehlszeilen-Batchdatei und Ausführen eines Skripts nicht exakt identisch mit dem dieselben Befehle, die in der gleichen Reihenfolge ausgeführt.Angenommen, ein Konsolenfenster öffnen, und führen Sie den folgenden nach jeder Zeile die EINGABETASTE drücken (Denken Sie daran, die Zeilennummern eingeben):

Get-Service
Get-Process

Geben Sie nun die genauen gleichen Zeilen in einer Skriptdatei oder das Skript ISE Bereich bearbeiten, und führen Sie das Skript. Erhalten Sie die Ergebnisse der verschiedenen suchen. Bei jedem Drücken von Enter in Windows PowerShell, starten Sie eine neue Pipeline. Was eingegebenen Befehle werden in diese einzelne Rohrleitung ausgeführt. Am Ende der Pipeline konvertiert Windows PowerShell seinen Inhalt in einer Textanzeige. Wenn Sie die beiden Befehle in der normalen Konsole ausführen, haben Sie dies in zwei unterschiedlichen Rohrleitungen getan.

Windows PowerShell konnte einen eindeutigen Anzeigenamen für jeden Satz von Ausgabe zu erstellen. Wenn in einem Skript eingegeben wird, lief jedoch beide Befehle in der gleichen Rohrleitung. Die Windows PowerShell-Formatierung System anspruchsvoll ist nicht genug, um dieselbe eindeutige Ausgabe für zwei unterschiedliche Ergebnisse zu erstellen. Versuchen Sie dies in der Konsole ausführen:

Get-Service;Get-Process

Diese Ergebnisse sollten gleich aussehen, wie sie beim Ausführen des Skripts, die diese beiden Befehle enthält. In diesem Fall werden beide Befehle in eine einzelne Rohrleitung ausgeführt. Das ist, was passiert, wenn Sie das Skript ausgeführt wurde.

Praktische vorteilhaft für all dies ist, dass ein Skript, nur eine Art von Ausgabe zu erzeugen. Es ist keine gute Idee, gegebener größtenteils auf die Grenzen des Systems Formatierung. Es gibt andere Überlegungen. Sie wollen nicht über ein Skript, das verschiedene Dinge in die Pipeline dumping, zur gleichen Zeit.

Konzentrieren Sie sich auf die Regel für alles, was wir behandeln werden. Ein Skript sollte eine und nur eine Art der Ausgabe generieren. Die einzige Ausnahme wäre, wenn sie ein Skript, das als Repository für mehrere Funktionen verwendet wird. In diesem Fall sollte jede Funktion eine und nur eine Art der Ausgabe zu generieren.

Variablen

Denken Sie an Variablen, als Feld. Sie können eine oder mehrere Elemente ablegen, sogar unterschiedliche Dinge in dieses Feld ein. Das Feld hat einen Namen, und in Windows PowerShell kann diesen Namen fast alles enthalten. "Var" kann ein Variablenname kann "{Meine Variable}" sein. In diesem zweiten Beispiel setzen die geschweiften Klammern ein Variablenname, der Leerzeichen enthält, das ist ziemlich hässlich. Es empfiehlt sich halten Sie bei Variablennamen, die Buchstaben, Zahlen und Unterstriche enthalten.

Unter Verwendung einer Variablen namens verweist auf die gesamte "Box". Wenn Sie den Inhalt des Feldes verweisen möchten, fügen Sie ein Dollarzeichen: $ var. Sie werden oft sehen Windows PowerShell Variablen, die das Dollarzeichen vorangestellt, da der Dreh-und Angelpunkt der Verwendung ist, um den Inhalt zu erhalten. Es ist wichtig, jedoch bedenken, dass das Dollarzeichen nicht Teil der Variablenname ist. Es ist nur ein Stichwort zu Windows PowerShell auffordern, den Inhalt, anstatt das Feld selbst. Beispiele:

$var = 'hello'
$number = 1
$numbers = 1,2,3,4,5,6,7,8,9

Diese Beispiele veranschaulichen die Elemente in einer Variablen, die mit den Zuweisungsoperator (=) zu platzieren. Dieses letzte Beispiel wird ein Array erstellt, da Windows PowerShell alle durch Kommas getrennte Listen als Array oder Auflistung Elemente interpretiert. Das erste Beispiel weist ein Zeichenfolgenobjekt mit den Zeichen in der Zeichenfolge in Anführungszeichen eingeschlossen.

Es ist ein Aspekt der Windows PowerShell, die Neulinge verwirren können. Windows PowerShell verstehen nicht"keine Bedeutung, die Sie einen Variablennamen zuordnen können". Eine Variable wie $Computername nicht "," der Shell sagen, dass die Variable einen Computernamen enthalten.

Ebenso sagen nicht $Zahlen"der Shell", dass eine Variable mehr als eine Zahl enthält. Die Shell kümmert sich nicht, wenn Sie einen plural Variablennamen verwenden. Die Anweisung

$numbers = 1

ist die Shell genauso gültig wie

$numbers = 'fred.'

Wenn eine Variablen mehrere Werte enthält wird, jedoch können eine spezielle Syntax Sie nur einer von ihnen Zugriff auf. Verwenden Sie als erstes Element $Zahlen [0], $Zahlen [1] ist das zweite, $Zahlen [-1] ist das letzte, $Zahlen – [2] ist der vorletzten und so weiter.

Anführungszeichen

Verwenden Sie einfache Anführungszeichen als bewährte Methode um eine Variable zu begrenzen, es sei denn, Sie einen bestimmten Grund etwas anderes zu tun haben. Es gibt drei bestimmte Instanzen, in denen Sie doppelte Anführungszeichen verwenden möchten.

Die erste ist, wenn Sie eine Variable Inhalt in eine Zeichenfolge einfügen müssen. In doppelten Anführungszeichen Windows PowerShell sucht nach der $ und geht davon aus, dass alles nach dem $ bis zum ersten Zeichen, das sich illegal in ein Variablenname ist ein Variablenname ist. Der Inhalt dieser Variablen ersetzt den Variablennamen und den $:

$name = 'Don'
$prompt = "My name is $name"

Die $Prompt wird jetzt "My Name is Don" enthalten, da durch den Inhalt der Variable $Name ersetzt werden. Dies ist ein großartiger Trick für Zeichenfolgen miteinander verknüpfen, ohne sie zu verketten.

In doppelten Anführungszeichen Windows PowerShell auch für Escape-Zeichen, die Einfaches schließendes Anführungszeichen oder Gravis-Akzent überprüfen und entsprechend zu handeln. Hier sind ein paar Beispiele:

$debug = "`$computer contains $computer"
$head = "Column`tColumn`tColumn"

Im ersten Beispiel wird das erste $ Escapezeichen "gesetzt werden." Die entfernt einer speziellen Bedeutung als eine Variable Accessor. Wenn $Computername 'SERVER' enthalten dann würde $Debug enthalten "$ Computername enthält SERVER."

Im zweiten Beispiel stellt ' t ein horizontaler Tabulator-Zeichen dar, so dass Windows PowerShell eine Registerkarte zwischen den einzelnen Spalten angelegt wird. Sie erhalten Informationen über andere besondere Escape-Zeichen in der Shell About_escape_characters Hilfethema.

Schließlich verwenden Sie doppelte Anführungszeichen, wenn eine Zeichenfolge Apostrophe enthalten muss:

$filter1 = "name='BITS'"
$computer = 'BITS'
$filter2 = "name='$computer'"

In diesem Beispiel wird das Zeichenfolgenliteral Name = 'Bit'. Die doppelten Anführungszeichen enthalten, die ganze Sache. Filter1 $ und $filter2 landen, die genau das gleiche, aber $filter2 ruft es mithilfe den Variable Ersatz Trick von doppelten Anführungszeichen. Beachten Sie, dass nur der äußerste Satz an Anführungszeichen tatsächlich von Bedeutung. Die einfachen Anführungszeichen innerhalb der Zeichenfolge nicht zu Windows PowerShell von Bedeutung sind. Diese einfache Anführungszeichen sind nur literalen Zeichen. Windows PowerShell interpretieren nicht.

Objektmember und Variablen

Alles in Windows PowerShell ist ein Objekt. Selbst eine einfache Zeichenfolge, wie z. B. "Name" ist ein Objekt vom Typ System.String. Sie können jedes beliebige Objekt mit Get-Member auf seinen Namen eingeben (d. h., die Art des Objekts ist), finden Sie unter sowie seiner Mitglieder, leiten die enthält, dessen Eigenschaften und Methoden:

$var = 'Hello'
$var | Get-Member

Verwenden Sie einen Punkt nach dem Namen einer Variablen, die Shell anzuweisen, "Ich will nicht das gesamte Objekt innerhalb dieser Variablen zugreifen. Ich möchte nur eine der zugehörigen Eigenschaften oder Methoden zugreifen." Geben Sie nach Ablauf der Name der Eigenschaft oder Methode.

Methodennamen werden immer durch eine Reihe von Klammern gefolgt. Einige Methoden akzeptieren Eingabeparameter, und gehen innerhalb der Klammern in einer durch Kommas getrennte Liste. Andere Methoden erfordern keine Argumente und so die Klammern sind leer, aber vergessen Sie nicht die Klammern:

$svc = Get-Service
$svc[0].
name
$name = $svc[1].
name
$name.length
$name.ToUpper()

Beachten Sie die Zeile. Es beginnt mit dem Zugriff auf das erste Element in der svc-Variable $. Der Zeitraum bedeutet "Ich will nicht das gesamte Objekt. Ich möchte nur eine Eigenschaft oder Methode." Dies greift auf die Name-Eigenschaft. Zeile 5 zeigt eine Methode zuzugreifen, durch die Bereitstellung von seinen Namens nach einem bestimmten Zeitraum, gefolgt von runden Klammern.

Ein Zeitraum ist normalerweise ein unzulässiges Zeichen in einen Variablennamen, da die Periode bedeutet, dass wir eine Eigenschaft oder Methode zugreifen möchten. Das bedeutet, dass es sich bei Zeile zwei im folgenden Beispiel die Weise funktioniert, die Sie erwarten können:

$service = 'bits'
$name = "Service is $service.ToUpper()"
$upper = $name.ToUpper()
$name = "Service is $upper"

In Zeile 2 enthält $Namen "der Dienst ist BITS.ToUpper()" wohingegen in Zeile 4 $ Name enthält "Service ist BITS."

Runde Klammern

Abgesehen von ihrer Verwendung mit Objektmethoden handeln Klammern auch als Marker der Auftragsausführung für Windows PowerShell, genau wie in Algebra. Mit anderen Worten, teilen Sie Klammern die Shell "zuerst ausgeführt werden." Die gesamte Klammerausdrucks Fassung was auch immer, dass dieser Ausdruck erzeugt. Hier ist ein paar Beispiele Puzzlesammlung:

$name = (Get-Service)[0].
name
Get-Service -computerName (Get-Content names.txt)

In einer Zeile enthält $Name den Namen des ersten Dienstes auf dem System. Lesen dies dauert ein wenig Aufwand. Beginnen Sie mit der eingeklammerten Ausdrucks. Das ist was Windows PowerShell sowie mit gestartet werden kann. "Get-Service" wird in einer Auflistung oder ein Array von Services aufgelöst. [0] Greift auf das erste Element in einem Array, so dass der erste Dienst. Da es von einem Punkt gefolgt wird, wissen wir, dass wir eine Eigenschaft oder Methode, der diesen Dienst, anstatt das gesamte Service-Objekt zugreifen. Zum Schluss ziehen wir nur den Namen des Dienstes.

In Zeile 2 ist der eingeklammerten Ausdrucks den Inhalt einer Textdatei lesen. Angenommen, die Datei enthält ein Computername pro Zeile, wählen Sie "Get-Content" "gibt ein Array von Computernamen zurück. Die werden an den Parameter "‑Computername" von "Get-Service" gefüttert. In diesem Fall kann die Shell eingeklammerten Ausdrucks, der ein Array von Zeichenfolgen zurückgibt Futtermittel die
"‑Computername"-Parameter, da der Parameter Arrays von Zeichenfolgen annehmen soll.

Bereich

Bereich ist eine Programmierkonzept, die als ein System der containertransportes fungiert. Dinge wie Variablen, Aliase, PSDrives und andere Windows PowerShell-Elemente sind in einem Bereich gespeichert. Die Shell eine Hierarchie von Bereichen verwaltet und verfügt über einen Satz von Regeln, die bestimmen, wie die Bereiche interagieren und Informationen mit anderen gemeinsam nutzen können.

Die Shell selbst ist ein einziger Bereich, die im globalen Gültigkeitsbereich aufgerufen. Wenn Sie ein Skript ausführen, er erstellt einen neuen Bereich, und das Skript ausgeführt wird, innerhalb dessen. Alles, was durch das Skript, wie z. B. eine neue Variable erstellt wird das Skript Rahmen gespeichert. Es ist nicht von der obersten Ebene Shell zugegriffen werden.

Wenn das Skript die Ausführung abgeschlossen ist, ihren Gültigkeitsbereich verworfen wird und etwas innerhalb erstellt verschwindet dieses Bereichs. Erstellen Sie z. B. ein Skript, das Folgendes enthält (vergessen Sie nicht die Zeilennummern nicht geben), und führen Sie dieses Skript aus dem Konsolenfenster:

New-PSDrive -PSProvider FileSystem -Root C:\ -Name Sys
Dir SYS:

Führen Sie manuell nach dem Ausführen des Skripts "Dir SYS:" und sollte einen Fehler angezeigt. Der Grund hierfür ist das SYS: Laufwerk in das Skript erstellt wurde. Sobald das Skript erledigt wurde, war alles, was er erstellt verworfen. SYS: Laufwerk ist nicht mehr vorhanden. Nicht alles, was in der Shell wird beschränkt. Elemente wie Module werden weltweit zu jeder Zeit behandelt. Ein Skript kann ein Modul geladen und das Modul wird geladen bleiben, nachdem das Skript ausgeführt wurde.

Wenn ein Bereich versucht, etwas zugreifen, die in diesem Bereich erstellt wurde, sieht der Windows PowerShell auf die nächst höhere Bereich (Bereich "Parent"). Das ist, warum die Dir arbeitete alias in diesem Skript, die Sie gerade eingegeben haben. Obwohl Dir nicht im Gültigkeitsbereich für das Skript gäbe, war Sie in die nächst höhere Gültigkeitsbereich vorhanden: der Bereich "global". Ein Bereich ist ein Element erstellen, die den gleichen Namen wie ein Element aus einem übergeordneten Bereich, aber hat. Hier ist ein weiteres Skript versuchen:

Dir
New-Alias Dir Get-Alias
Dir

Die möglicherweise seltsam aussehen, aber sie "Dir", führte zum ersten Mal nicht im Gültigkeitsbereich für das Skript vorhanden. Er verwendet den übergeordneten Alias von Dir. Dieses Alias verweist auf Get-ChildItem, so dass es eine vertraute Verzeichnisliste angezeigt.

Anschließend erstellt das Skript einen neuen alias namens Regie: Dies weist auf Get-Alias. Das ist, was zum zweiten Mal ausgeführt wurde. Dies keinen Einfluss auf der obersten Ebene Dir-Alias. Versuchen Sie es Dir in der Shell ausführen, nachdem das vorherige Skript ausgeführt, und erhalten Sie noch eine Verzeichnisliste.

Anwendungsbereich kann vor allem verwirrend sein, wenn es darum, Variablen geht. In der Regel sollten ein bestimmten Bereichs niemals außerhalb des Zuständigkeitsbereichs Artikel, insbesondere Variablen zugreifen. Gibt es eine Syntax dafür, wie die Verwendung von globalen $: Var auf zwangsweise im globalen Gültigkeitsbereich $Var-Variable zugreifen, aber das ist kein empfehlenswertes Verfahren mit Ausnahme unter sehr speziellen Umständen.

Windows PowerShell-Scripting-Sprache

Windows PowerShell enthält eine stark vereinfachte Skriptsprache von weniger als zwei Dutzend Schlüsselwörtern. Das ist ein starker Kontrast, um eine vollständige Programmiersprache, wie z. B. VBScript, die fast 300 Schlüsselwörter enthält.

Vereinfacht, wenn es sich, ist die Windows PowerShell-Sprache mehr als ausreichend, um die Arbeit zu erledigen. Ich werde nun ihre wichtigsten Skripting-Konstrukte überprüfen, auch wenn Sie weitere Hilfe immer auf diese durch das Lesen der entsprechenden "Thema innerhalb der Shell über" erhalten können. About_switchcontains-Informationen für die Switch-Konstrukt während Hilfe About_if Informationen über die If enthält z. B.-Hilfe zu erstellen. Führen Sie die Hilfe über * für eine Liste aller "Themen about".

Die If-Konstrukt

Dies ist das wichtigste Entscheidungsfindung Windows PowerShell-Konstrukt. In seiner vollständigen Form sieht folgendermaßen aus:

If ($this -eq $that) {
  # commands
} elseif ($those -ne $them) {
  # commands
} elseif ($we -gt $they) {
  # commands
} else {
  # commands
}

Das Schlüsselwort "If" ist obligatorischer Bestandteil dieses Konstrukt. Eingeklammerten Ausdrucks folgt ein, die ausgewertet werden müssen auf True oder False. Windows PowerShell wird immer 0 (null) als falsch und ein Wert ungleich Null als True interpretiert.

Windows PowerShell erkennt auch die integrierten Variablen $True und $False als die booleschen Werte darstellen. Wenn der Ausdruck in Klammern true funktioniert, werden die Befehle in den folgenden Satz von geschweiften Klammern ausgeführt. Wenn der Ausdruck False ist, wird nicht die Befehle ausführen. Das ist wirklich alles, was, die Sie für eine gültige If erstellen müssen.

Sie können ein bisschen weiter gehen, durch die Bereitstellung eines oder mehrerer Abschnitte von "ElseIf". Diese Arbeit, die die gleiche Weise aus wie If erstellen. Sie erhalten ihre eigenen eingeklammerten Ausdrucks. Wenn es True ist, werden die Befehle in den folgenden geschweiften Klammern ausgeführt. Wenn dies nicht der Fall ist, wird sie nicht.

Sie können mit einer Else-Blockes einpacken der ausgeführt wird, wenn keine den vorangehenden Blöcken ausgeführt. Nur der Block der ersten wahren Ausdruck zugeordnet ist, wird ausgeführt. Beispielsweise, wenn $ nicht taten gleich $, und $diejenigen ungleich $und dann die Befehle in Zeile 4 würde ausführen – und sonst nichts. Windows PowerShell wird nicht auch der zweiten Elseif-Ausdruck in Zeile 5 ergeben.

Das Zeichen # ist ein Kommentarzeichen, machen Windows PowerShell im wesentlichen alles von dort bis ein Wagenrücklauf ignorieren zurück. Beachten Sie auch die Pflege, mit der diese Konstrukte formatiert wurden. Sie können auch sehen, Formatierung einige Leute wie folgt:

Es spielt keine Rolle, platzieren Sie die geschweiften Klammern. Jedoch, welche Rolle spielt ist, dass Sie konsistent in Ihre Platzierung so Ihre Skripts einfacher zu lesen sind. Es ist auch wichtig, jede Zeile innerhalb der geschweiften Klammern auf genau dieselbe Ebene eingerückt.

ISE "Windows PowerShell" können Sie die Tab-Taste zu diesem Zweck zu verwenden, und standardmäßig einen vierstelligen Einzug. Einrücken von Code ist eine bewährte Methode für Core. Wenn Sie dies nicht tun, müssen Sie eine harte Zeit ordnungsgemäß übereinstimmende öffnende und schließende geschweifte Klammern in komplexen Skripts. Außerdem werden alle anderen Windows PowerShell Kinder Spaß von Ihnen machen. Betrachten Sie diese schlecht formatierte Skript:

function mine {
if ($this -eq $that){
get-service
}}

Das ist viel schwieriger zu lesen, zu debuggen, Problembehandlung und zu verwalten. Während das Leerzeichen nach dem schließenden Klammern nicht erforderlich ist, macht es Ihr Skript leichter zu lesen. Der Code eingerückte ist nicht notwendig, aber es macht Ihr Skript leichter zu folgen. Berücksichtigen Sie dies:

function mine {
 if ($this -eq $that){
  get-service
 }
}

Eine einzelne schließende geschweifte Klammer in einer Zeile platzieren, indem selbst ist nicht erforderlich, von der Shell, aber es wird geschätzt, durch das menschliche Auge. Ein Formatierungsprogramm gepflegt werden, und Sie müssen weniger Probleme in Ihren Skripts.

Die Do While-Konstrukt

Dies ist ein Schleifenkonstrukt in Windows PowerShell. Es wurde entwickelt, um einen Block von Befehlen zu wiederholen, solange eine Bedingung True ist, oder bis eine Bedingung True. Hier ist die grundlegende Verwendung:

Do {
  # commands
} While ($this -eq $that)

In dieser Variante des Konstrukts werden die Befehle innerhalb der geschweiften Klammern immer mindestens einmal ausgeführt. Die While Bedingung wird erst nach der ersten Ausführung nicht ausgewertet. Sie können die While verschieben, in diesem Fall werden die Befehle nur ausgeführt, wenn die Bedingung True ist, die in erster Linie:

While (Test-Path $path) {
  # commands
}

Beachten Sie im zweiten Beispiel verwenden keinen Vergleichsoperator wie z. B. - EQ. Denn das Test-Path-Cmdlet zu True oder False zurück, die von Anfang an passiert ist. Besteht keine Notwendigkeit, die auf True oder False, damit der Ausdruck Arbeiten vergleichen.

Der Klammerausdruck nur mit diesen Konstrukten scripting verwendet muss auf True oder False zu vereinfachen. Wenn Sie einen Befehl wie z. B. Test-Path verwenden, müssen die immer True oder False zurückgibt, die alles, was Sie ist. Wie immer, gibt es ein Thema "Info" in der Shell, die andere Möglichkeiten zum Verwenden dieses Konstrukt veranschaulicht.

Das ForEach-Konstrukt

Dieses Konstrukt ist an das Cmdlet "ForEach-Object" funktionieren ähnlich. Es unterscheidet sich nur in der Syntax. Der Zweck der ForEach ist eine Matrix (oder eine Auflistung, die in Windows PowerShell ein Array identisch ist) und Aufzählen der Objekte im Array, so dass Sie jeweils einzeln bearbeiten können:

$services = Get-Service
ForEach ($service in $services) {
  $service.Stop()
}

Es ist einfach für Einsteiger in die overthink dieses Konstrukt. Denken Sie daran, die im plural englische Wort "Services" bedeutet nicht, etwas zu Windows PowerShell. Diesen Variablennamen wird verwendet, um uns zu erinnern, dass sie einen oder mehrere Dienste enthält. Nur weil es im plural ist machen nicht die Shell auf besondere Weise Verhalten.

Das Schlüsselwort "in" in Zeile zwei ist Teil der ForEach-Syntax. Die Variable $-Dienst besteht. Es könnte leicht gewesen, denen Fred oder $Kaffee und es genau so würde in gearbeitet haben $.

Windows PowerShell wird das Konstrukt Befehle wiederholt – die in geschweiften Klammern enthalten sind – einmal für jedes Objekt in der zweiten Variablen ($Services). Jedes Mal wird es nehmen Sie ein einzelnes Objekt aus der zweiten Variablen ($Services) und legen Sie sie in der ersten Variablen ($Service).

Verwenden Sie die erste Variable ($Service) innerhalb dieses Konstrukt mit einem einzelnen Objekt arbeiten. Der Zeitraum angibt, auf Zeile 3, "Ich möchte nicht das gesamte Objekt, nur eines seiner Mitglieder zu arbeiten – die Stop-Methode."

Es gibt Zeiten, wenn mithilfe von ForEach unvermeidlich und wünschenswert ist. Allerdings haben Sie etwas Programmierung oder Skripting Erfahrung, können Sie manchmal leap, ForEach zu verwenden, wenn es nicht, dass der beste Ansatz. Im vorherige Beispiel ist ein guter Grund mithilfe von ForEach nicht. Wäre dies nicht einfacher:

Get-Service | Stop-Service

Hier ist Ihre Nutzung von ForEach auszuwerten. Stellen Sie sicher, dass es die einzige Möglichkeit zum Ausführen der Aufgabe zur hand ist. Hier sind einige Fällen ForEach wahrscheinlich die einzige Möglichkeit, go ist:

  • Wenn Sie eine Methode für eine Reihe von Objekten ausführen müssen und es kein Cmdlet gibt ausführt, die die entsprechende Aktion.
  • Wenn Sie haben eine Reihe von Objekten und mehrere aufeinander folgende Maßnahmen gegen jede durchführen müssen.
  • Wenn Sie haben eine Aktion, die nur für ein Objekt zu einem Zeitpunkt ausgeführt werden kann, aber Ihr Skript kann mit einem oder mehreren Objekten arbeiten, und Sie haben keine Möglichkeit, im voraus zu wissen.

Weitere Konstrukte

Windows PowerShell verfügt über mehrere andere scripting Konstrukten, einschließlich Schalter für und so weiter. Dies sind alle in "Hilfethemen innerhalb der Shell über" dokumentiert. In manchen Fällen können Sie die Konstrukte, die hier behandelt, um die anderen Konstrukte zu ersetzen. Sie können z. B. Switch ersetzen, mit einer If-Konstrukt, das mehrere ElseIf-Abschnitten verwendet. Sie können für die mit ForEach oder sogar mit der ForEach-Object-Cmdlet ersetzen. Z. B. die Notwendigkeit einer Schleife, die genau 10 Mal ausgeführt wird:

1..10 | ForEach-Object -process {
  # code here will repeat 10 times
  # use $_ to access the current iteration
  # number
}

Es liegt an Ihnen die Auswahl das besten Konstrukt an die Arbeit zu erledigen. Wenn Sie das Internet für Skripts durchsuchen, Bedenken Sie, über allen Variationen ausgeführt werden.

Functions

Eine Funktion ist eine besondere Art von Konstrukt verwendet, um eine Gruppe verwandter Befehle enthalten, die einen bestimmten Vorgang ausführen. Im Allgemeinen können Sie jedes Skript Windows PowerShell nehmen und es innerhalb einer Funktion "wrap":

function Mine {
  Get-Service
  Get-Process
}
Mine

Dies definiert eine neue Funktion namens "Mine". Im Grunde verwandelt, die mir in einen Befehl, was bedeutet, dass Sie die Funktion ausführen können, einfach durch Eingabe des Namens. Das ist was bedeutet fünf Linie. Es wird die Funktion ausgeführt.

Funktionen sind in der Regel in einer Skriptdatei enthalten. Ein einziges Skript kann mehrere Funktionen enthalten. Funktionen können sich auch andere Funktionen enthalten.

Funktionen sind jedoch Gültigkeitsbereich Elemente. Das bedeutet, dass Sie nur eine Funktion innerhalb desselben Gültigkeitsbereichs können in der es erstellt wurde. Wenn Sie eine Funktion in ein Skript, und führen Sie dieses Skript, wird die Funktion nur innerhalb des Skripts und nur für die Dauer des Skripts verfügbar sein. Wenn das Skript abgeschlossen ist, die die Funktion ausgeführt – wie alles andere im Gültigkeitsbereich für das Skript – verschwindet. Hier ist ein Beispiel:

function One {
  function Two {
Dir
  }
  Two
}
One
Two

Genommen Sie an, Sie geben Sie Folgendes in eine einzelne Skriptdatei, und führen Sie dieses Skript. Zeile 7 führt die Funktion ein, die in einer Zeile beginnt. Zeile 5 führt eine Funktion mit dem Namen zwei, die auf der Zeile beginnt. Damit das Ergebnis einer Verzeichnisliste werden auf Linie drei innerhalb der Funktion zwei.

Allerdings die nächste Zeile ausgeführt werden, dass Zeile acht und zu einem Fehler führt. Das Skript enthält eine Funktion namens zwei. Innerhalb einer Funktion ist die Funktion zwei begraben. Als Folge ist, die innerhalb der Funktion ein Bereich vorhanden. Nur andere Dinge innerhalb einer Funktion können zwei sehen. Versuch, zwei von überall sonst aufrufen, führt zu einem Fehler.

Hinzufügen von Parametern zu einem Skript

Es ist selten, ein Skript zu erstellen, die genau das gleiche zu tun, jeder Ausführung vorgesehen hat. In vielen Fällen müssen Sie Skripts, die eine Art von Variablen Daten oder Variablen Verhalten enthalten. Sie können diese Varianten mit Parametern gerecht werden.

Parameter werden in einer besonderen Weise am oberen Rand des Skripts definiert. Sie können diese Definition mit Kommentaren voranstellen, aber es muss die ersten ausführbaren Codezeilen innerhalb des Skripts anders sein. Auf dem Gebiet der Parameter Definition wird jeder Parameter von der nächsten durch ein Komma getrennt. Im Einklang mit der Idee der ordentlichen Formatierung hilft es jeden Parameter in einer eigenen Zeile platzieren. Im Folgenden ein Beispiel:

param (
  [string]$computername,
  [string]$logfile,
  [int]$attemptcount = 5
)

Dieses Beispiel definiert drei Parameter. Innerhalb des Skripts werden diese einfach wie jede andere Variable verwendet. Sie werden bemerken, dass in Zeile 4, I $Attemptcount-Parameter einen Standardwert zugewiesen. Der Standardwert wird von jeder Eingabeparameter überschrieben werden, aber verwendet werden kann, wenn das Skript ausgeführt wird, ohne diesen Parameter angegeben wird.

Hier gibt mehrere Möglichkeiten, die in denen das Skript möglicherweise davon aus, dass ich es als ps1 gespeichert ausgeführt werden:

./test -computername SERVER
./test -comp SERVER -log err.txt -attempt 2
./test SERVER err.txt 2
./test SERVER 2
./test -log err.txt -attempt 2 -comp SERVER

Das Skript akzeptiert Parameter ziemlich genau wie beliebige Cmdlets. Variablennamen dienen als den Parameternamen angegeben, die mit den üblichen Strich, der alle Parameternamen in der Windows PowerShell vorangestellt ist. Hier ist eine Aufteilung, wie es funktioniert:

  • Zeile 1, ich bin nur Angabe unter einer der Parameter –$ Logfile somit leer sein, und $Attemptcount 5, den Standardwert enthält.
  • In Zeile 2 bin ich alle drei Parameter angeben, obwohl ich mache so Parameternamen mit verkürzt werden. Wie bei Cmdlets, müssen Sie nur Geben Sie genug von den Parameternamen für Windows PowerShell zu wissen, welches Sie sprechen.
  • In Zeile 3 zeigt mir noch einmal alle drei Parameter, obwohl dies positionsbezogen, ich mache ohne Verwendung von Parameternamen. Als ich erinnere zum Bereitstellen von Werten in der exakten Reihenfolge mich, in der die Parameter im Skript aufgeführt sind, wird dadurch fehlerfrei funktionieren.
  • Linie vier zeigt, was geschieht, wenn Sie nicht vorsichtig sind. Hier wird $Computername 'SERVER' enthalten. und 2, $Logfile enthält, während 5 $Attemptcount enthält. Das ist wahrscheinlich nicht, was ich wollte. Wenn Sie keine Parameternamen verwenden, ist es schwieriger, um flexibel zu sein. Es ist auch schwieriger für jemand anderen zu decodieren, was Sie bedeutete das macht es schwieriger für sie potenzielle Probleme behandeln.
  • Zeile 5 ist ein besseres Beispiel. Klicken Sie hier, ich habe angegebenen Parametern, die nicht in Ordnung, aber das ist gut, weil ich Parameternamen verwendet. Als Faustregel verwende ich immer Parameternamen für das größte Maß an Flexibilität. Ich brauche nicht die Reihenfolge Denken Sie daran, in der sie kamen.

Erweiterte Scripts

Windows PowerShell unterstützt eine Technik für Weitere Informationen zu Parametern angeben. Auf diese Weise können Sie einen Parameter als obligatorisch, akzeptieren die Eingabe aus der Pipeline und so weiter zu deklarieren. Diese Technik wird als Cmdlet Bindung bezeichnet.

Es ändern nicht, wie das Skript Parameter verwendet. Es gibt einfach der Shell ein bisschen mehr Informationen zu den Parametern. Sie finden diese Technik im Allgemeinen in einer Funktion verwendet, aber die Syntax ist gültig in einem Skript sowie. Hier ist ein einfaches Beispiel:

[CmdletBinding()]
param (
  [Parameter(Mandatory=$True)]
  [string]$computername,

  [Parameter(Mandatory=$True)]
  [string]$logfile,

  [int]$attemptcount = 5
)

Alle hinzugefügten wurde die Anweisung [CmdletBinding()] als erste ausführbare Zeile des Codes innerhalb des Skripts. Es ist okay für Kommentare, aber sonst nichts vorausgehen. Ich habe auch eine Anweisung [Parameter()] auf zwei meiner Parameter. Innerhalb dieser Anweisung [Paramater()] habe ich darauf hingewiesen, dass dieser Parameter obligatorisch sind. Nun, wenn jemand versucht, das Skript ausführen, ohne diese Parameter angeben, werden Windows PowerShell Informationen aufgefordert.

Beachten Sie, dass der letzte Parameter muss keine speziellen Anweisungen, und alle drei Parameter in einer durch Kommas getrennte Liste (d. h., die die ersten beiden Parameter, durch Kommas gefolgt sind) weiterhin angezeigt werden. Es gibt eine Tonne von anderen Anweisungen können Sie für einen Parameter, die Sie zum Lesen können, in der About_functions_advanced_parameters Hilfethema.

Dies war eine grobe Bewertung für einige wichtige Windows PowerShell scripting-bezogene Begriffe. Ich hoffe, Sie haben ein oder zwei Dinge gelernt. Zu parametergesteuerten Skripten erstellen eignet sich besonders, da Sie Skripts vornehmen können, die das Aussehen und Verhalten wie die systemeigenen Windows PowerShell-Cmdlets.

Don Jones

Don Jones ist ein Microsoft MVP-Auszeichnung Empfänger und Autor von "Erfahren Sie Windows PowerShell in ein Monat der Mittagessen" (Manning Publications, 2011), ein Buch soll jeder Administrator Windows PowerShell wirksam zu helfen. Jones bietet auch Schulungen für Öffentliche und vor-Ort-Windows PowerShell. Sie erreichen ihn über seine Website unter ConcentratedTech.com.

Verwandter Inhalt