Windows PowerShell Was nicht Skript

Don Jones

Inhalt

Führen Sie nicht oft Variablen
Sinnvolle Variable Namen
Vereinfachen von Vergleichen
Ihr Skript nicht anhalten
Durchlaufen der Schleife
Nicht so automatische werden
Show Me des Skripts

Ich habe kürzlich ein Angebot (der noch steht) an Leser des vorgenommen Meine ConcentratedTech.comBlog: Senden Sie mir Ihre Windows PowerShell-Skripts und ich werde überprüfen und anbieten Vorschläge habe ich Sie verbessern. Die Idee tatsächlich stammt aus einer Umfrage meinen Pr-Blogger und ich habe – ein Leser vorgeschlagen, dass dies eine großartige, reale Möglichkeit für Personen, Ihre Skripts Fähigkeiten zu verbessern bieten würde. In den vergangenen Monaten haben ich einige Trends bemerkt, wie ich selbst einige bestimmte Vorschläge wiederholt vornehmen. So haben ich eine Liste von Ihnen hier mit Ihnen teilen kompiliert.

Lassen Sie mich ersten Zustand, jedoch, dass alle Skripts, die die Auftrag durchgeführt (erfolgreich und ohne Begleitmaterial Schaden natürlich) ein gute Skript ist. Einige der Dinge, die ich bin vorschlagen mag Nitpicky und einige von Ihnen sicherlich sind. Verfügt jedoch jeder meiner Vorschläge einige bedeutende Vorteile über probieren darauf hinweisen, wie ich.

Dauern Sie nicht Verstoßes, wenn Sie tatsächlich einiger "ungültigen Vorgehensweisen" die ich darauf tun hinweisen. Ich weiß, dass viel von Personen in Windows PowerShell das Skript Skripterstellung mit VBScript begann und einige dieser "ungültigen Vorgehensweisen" tatsächlich sehr häufig in der Welt VBScript. Dies ist eine hervorragende Gelegenheit, erfahren Sie, wie Windows PowerShell und VBScript etwas anders sind und Schreiben von Skripts, die die eindeutige Vorteile verwenden Windows PowerShell zu bieten hat.

Mit, sagte sind hier Meine Top sechs allgemeine Vorschläge, die ich in den vergangenen Monaten vorgenommen haben.

Führen Sie nicht oft Variablen

Natürlich Variablen sind nützlich, aber wir nicht abrufen ausgeführt ausgeblendet. Es haben ein Großteil dieser Art von scripting angezeigt wurde:

$varfile = "c:\names.txt"
$varexists = Test-Path $varfile
if ($varexists –eq $false) {
  Write-Output "The file $varfile does not exist"
  break
}
$varnames = Get-Content $varfile

Es gibt ein paar Methoden, die ich gerne finden Sie unter Beispiel wie folgt geändert. Zuerst und vor allem, gibt es wenig müssen alle diese Informationen in Variablen bleiben. Es ist möglich, diese mit weniger Variablen neu zu schreiben. Warum kümmern? Gut, die Shell möglicherweise nicht wie viele Variablen, die Sie verwenden, wichtig, aber ich bin ein Fan groß, Skripts jemand Ihr Skript auf Papier oder in einem Skripteditor gelesen und in der Lage herausfinden, was das Skript tut, kann als lesbar wie möglich machen. Weitere Variablen Sie einbeziehen, desto jemand, in seinem Head verfolgen – und umso unwahrscheinlicher er können herausfinden, was das Skript bis zu ist. Wenn ich das Skript auf Papier herausfinden nicht möglich, bin ich weniger wahrscheinlich möglich, das Skript zu debuggen, liegt ein Problem. Damit ich starten würden durch dieses Beispiel wie folgt umschreiben:

$varfile = "c:\names.txt"
If ((Test-Path $varfile) –eq $false) {
Write-Output "The file $varfile does not   exist"
  break
}
$varnames = Get-Content $varfile

Alle ich wirklich tun habe eliminiert die Variable $ Varexists und direkt unter Verwendung die Ausgabe des Test-Path. Auf diese Weise ich brauchen die If betrachten erstellen, finden Sie unter $ Varexists zurückgehen und herausfinden, welche $ Varexists enthalten soll. Es ist weniger für mich in meinem Kopf nachzuverfolgen. Beachten Sie, dass ich $ Varfile Left; ist da ich die Informationen drei Mal verwenden, wenn Sie möchten Informationen mehrmals wiederverwendet und anschließend es lohnt sich in einer Variablen.

Sinnvolle Variable Namen

Im vorherigen Beispiel fortsetzen, stets, Variablennamen helfen sollten Sie Bedenken innerhalb einer Variablen. Sie müssen Namen Präfixe wie "Var" verwenden, da das Zeichen $ Ihnen mitteilt, ist es eine Variable. In der Tat name Präfixe wie "str" für Zeichenfolgen oder "Int" für Ganzzahlen veraltet sind ("ist daher 1993" Was ich sagen, wenn ich bin unterrichten Klassen). Verwenden Sie einfache Variablennamen. Hier ist das Beispiel geschrieben:

$filename = "c:\names.txt"
If ((Test-Path $filename) –eq $false) {
Write-Output "The file $filename does not exist"
  break
}
$computernames = Get-Content $filename

Vereinfachen von Vergleichen

Ich bin kein Fan von Vergleichsoperatoren in Windows PowerShell – diejenigen, wie –gt, Lt, Eq und usw.. Meinen Mangel Vorliebe stammt wahrscheinlich aus meiner lang Erfahrung mit VBScript, wo ich vertraute Operatoren wie z. B. verwenden konnte >, <, und =. Viele von Ihnen wahrscheinlich diese Operatoren aus Note Schule mathematischen Lektionen erkennen und so erfordern weniger Ihre analysieren, wenn Sie diese lesen. Wann immer möglich, möchte ich dann verwenden Sie einen Operator. Und jede Bedingung, in dem Sie etwas werden überprüfen, True oder False ist eine Gelegenheit um einen Operator zu entfernen:

$filename = "c:\names.txt"
If (-not (Test-Path $filename)) {
Write-Output "The file $filename does not exist"
  break
}
$computernames = Get-Content $filename

Da das Cmdlet „ Test-Path True oder false zurückgibt, ist es nicht notwendig, es auf True oder False verglichen werden soll. Alles innerhalb des If erstellt Klammern muss auf True oder false boil nach unten. Normalerweise verwenden Sie einen Vergleich, erreichen, aber wenn alles, was es ist bereits generieren True oder False ist, können Sie nur die Informationen direkt verwenden.

Ich beachten, dass der –not-Operator eine wird ich tatsächlich möchten. Es ist eher allgemeine Englisch als die entsprechende! =-Operator von vielen Sprachen verwendet.

Darüber hinaus sollte ich die Klammern kommentieren ich um Test-Path und dessen Eingabeparameter $ Filename eingefügt habe. Ich haben die Befehle in Klammern einschließen, da es mir visuell als einzelne Einheit erfassen hilft gestartet. Windows PowerShell verwendet ein anderes Zeichen, sondern Leerzeichen um Dingen wie Befehle, Parameternamen und Werte der Parameter zu trennen. Die gesamten Befehlszeichenfolge in Klammern einschließen hilft mir zusammen, ohne dass ich tatsächlich betrachten Sie die Leerzeichen und bestimmen, wo der Befehl startet und beendet angezeigt.

Ihr Skript nicht anhalten

Der letzte Vorschlag, den es für dieses Beispiel ausführen verfügbar, ist die Möglichkeit, die seine Logik integriert ist. Wenn die Datei existiert, unterbrechen ich außerhalb des Skripts. Wenn die Datei vorhanden ist, ich nie die Break-Anweisung auszuführen, und damit das Skript wird fortgesetzt. Wann immer möglich, möchte ich vermeiden Wechsel um ein Skript zu beenden. Ich möchte das Beispiel schreiben – erneut – wie folgt:

$filename = "c:\names.txt"
If (Test-Path $filename) {
$computernames = Get-Content $filename
  # do whatever we planned to do
} else {
Write-Output "The file $filename does not exist"
}

Auf diese Weise ich habe die Logik in der If vereinfacht erstellen. Ich haben auch die Notwendigkeit, die Break-Anweisung verwenden, die verringert Verwirrungen das Skript Aktionen wird entfernt. Ich bin der erste zugeben, dass dieser Vorschlag unbedingt ein Nitpick, aber ich, denke gute Programmierpraktiken helfen besser Skripts nehmen und dies ist definitiv eine bessere Vorgehensweise als bricht außerhalb eines Skripts Datumwert. Diese Art von Konstrukt ist leichter zu debuggen und es ist viel einfacher auf Papier folgen, wenn Sie ein Skript betrachten und herausfinden, was Sie leistet möchten.

Durchlaufen der Schleife

Einige der Skripts, die ich durchgesehen benötigt, um Informationen aus einer Textdatei und durchlaufen jedes Zeile der Datei gelesen. Beispielsweise sollten Sie eine Reihe von Computern, Kontakt, so dass Sie Ihren Namen ein Name pro Zeile in einer Textdatei auflisten konnte. Hier ist ein common Konstrukt, das ich gesehen habe:

$line = 0
$names = get-content c:\names.txt
while ($line –lt $names.length) {
  # do something with $names[$line]
  $line++
}

Dadurch lädt die Datei in der Variablen $ Names und listet dann manuell die durch die Auflistung gedrückt, als wäre es sich um ein Array. Den die Variable $ Zeile behält Überblick über die Zeile mit dem ich arbeite. Es funktioniert, aber ich habe etwas mehr Arbeit als muss ich tun, und ich bin vornehmen des Codes etwas schwieriger für jemand anders später lesen ausführen. Das ForEach-Konstrukt in Windows PowerShell ist ein wenig besser geeignet zum Enumerieren von Auflistungen. (Technisch gesehen gibt Get-Content eine Auflistung kein Array). Verwenden stattdessen Sie diese:

Foreach ($name in (Get-Content c:\names.txt))
{
  # do something with $name
}

Es gibt hier ein paar Vorteile. Ich bin im Einklang mit meinem vorherigen Vorschlag den Aufruf von Get-Content rechts in das-Konstrukt, versetzen, da ich denke, ist es etwas deutlicher, was passiert. ForEach werden aufgelistet, über die gesamte Auflistung unabhängig davon wie lang ist. Jedes Mal durch, wird, nutzen das nächste Element in der Auflistung und fügen Sie das Element in die Variable $ Name. Damit der Name der Variablen darstellt, was es enthält – eines Computername. Und, erleichtert das Skript lesen und befolgen Sie.

Windows PowerShell Q & A

F Gibt es eine Möglichkeit, einen dauerhaften benutzerdefinierten Alias in Windows PowerShell definieren?

ein Wenn Sie jemals einen neuen Alias erstellt haben, haben Sie wahrscheinlich bemerkt, dass es geschlossen, wird wenn Sie die Shell schließen. Beispielsweise erstellt dies einen neuen Alias d, ist eine Verknüpfung mit dem Get-ChildItem-Befehl:

Neuer Alias d Get-ChildItem

Wenn ich die Shell schließen, der Alias geht jedoch verloren. Der Trick besteht darin, ein Windows PowerShell-Profil zu erstellen. Erstellen Sie im Ordner Dokumente einen neuen Ordner namens WindowsPowerShell. Erstellen Sie in diesem Ordner eine Textdatei, die mit dem Namen profile.ps1. Der Textdatei versehen alle Befehle, die Sie automatisch jedes Mal ausgeführt wird, die Shell startet, möchten – einschließlich einer neuen Aliasdefinition. Das Profil wird sichergestellt, dass die Befehle ausgeführt werden jedes Mal Sie starten die Shell erstellen einen "permanenten" Alias, die immer in Windows PowerShell zur Verfügung stehen.

Müssen nicht Sorgen über welche Zeile ich arbeite mit oder eine $ Zeile Variable, um zu verfolgen, die beibehalten – das ForEach-Konstrukt für mich hat. Beseitigung von drei Zeilen Code stellt den Code etwas kurze und fordert Sie zum Nachverfolgen weniger Dinge im Kopf Wenn Sie herausfinden, was das Skript bewirkt.

Nicht so automatische werden

Die einer praktischen Übung wirklich in die Bud nip soll wird Shell-Fehler in einem gesamten Skript unterdrückt. Genommen Sie an, Sie ein Skript anzeigen, die diese Zeile rechts oben enthält:

$ErrorActionPreference = "SilentlyContinue"

Sofort beenden.

Er unterdrückt werden, aber dies nicht Fehler ausgeblendet nehmen. Ja, es gibt sicherlich Mal, wenn Sie werden vorhersehen und ignorieren einen bestimmten Fehler, wie z. B. bei (Windows Management INSTRUMENTATION) Verwendung Verbindung zu Remotecomputern, die möglicherweise nicht verfügbar sind. Es gibt jedoch nie ein Grund für global Fehler ignorieren. Fehlermeldungen sind nützlich und Probleme hinweisen, dass Sie manchmal beheben können.

Wenn Sie Fehler für ein bestimmtes Cmdlet ignorieren möchten, können Sie dazu das Cmdlet „ Parameters "SilentlyContinue" –EA hinzugefügt. Wenn Sie für mehrere Befehle in einer Zeile die Fehler ignorieren möchten, entweder jeweils den Parameter –EA hinzugefügt oder fügen Sie die $ ErrorActionPreference Zeile unmittelbar vor die Befehle und nach diesen Befehlen, hinzufügen:

$ErrorActionPreference = "Continue"

Fehlerbehandlung auf normal festgelegt.

Persönlich gern nicht ich deaktivieren Fehler überhaupt, wenn ich diese Fehler selbst behandeln bin. Beispiel:

Trap {
  # output error to a log file or something
}
Get-WmiObject Win32_Service –computerName $remote –EA Stop

Dieses kurze Beispiel zeigt, wie der –EA "Stop"-Parameter true Ausnahmen, sondern nur Fehlermeldungen, Ihnen die Gelegenheit, diese auffangen und behandeln diese auf eigene generiert wird. Sie möglicherweise in einer Datei protokollieren, benutzerfreundlicher Fehlermeldung angezeigt, oder führen etwas an.

Show Me des Skripts

Wie bereits erwähnt, wurden einige dieser ein Bit-Nitpicky – jedoch alle bietet deutliche Vorteile, die zu berücksichtigen sind. Ich möchten Sie Ihre eigenen Windows PowerShell-Skripts gemeinsam einladen. Ich ein Paar pro Monat überprüfen und eigene Vorschläge auf buchen ConcentratedTech.com. Gerne einige meiner früheren Vorschläge nachschlagen und vielleicht auch Ihre eigenen Skripts zur Überarbeitung senden. Ich freuen zu hören, von Ihnen!

Don Jones ist ein Mitbegründer von Concentrated Technology. Sie können Tipps für Windows PowerShell und andere IT-Themen lesen, ebenso wie Sie erreichen Don, in seinem Blog unter ConcentratedTech.com.