Windows PowerShell: Erstellen Sie bessere Funktionen

Die erweiterten Funktionen in Windows PowerShell 2.0 ermöglichen die Emulation systemeigener Cmdlets mit einem relativ einfachen Skript.

Don Jones

In Windows PowerShell 2.0 führte Microsoft eine neue Art von Funktion mit der Bezeichnung als "erweiterten Funktion". Viele Leute nennen dies eine "Skript Cmdlet". Die Idee mit diesen Funktionen ist, dass Sie nun die vereinfachte Skriptsprache der Windows PowerShell verwenden können, um etwas zu schaffen, sieht, Works, Gerüche und fühlt sich fast genauso wie eine echte, native Windows PowerShell-Cmdlet.

Natürlich sind nicht alle von Ihnen in der Lage, erstellen Sie wiederverwendbare Tools für sich selbst und Ihre Kollegen werden soll. Wenn Sie wiederverwendbare Tools erstellen, sind diese erweiterten Funktionen der einzige Weg zu gehen. In der Tat bin ich derzeit meine Klassenzimmer Schulungsmaterialien zu Lehren nur diese Art von Funktion ändern.

Da erweiterte Funktionen wie real-Cmdlets arbeiten, kann eine ordnungsgemäß durchgeführte Funktion sein leichter zu verwenden, da es "den Rest der Shell arbeiten passend". Diese erweiterten Funktionen erstellen, die nicht der Fall, hier die Vorlage, die Sie schnell mehr verwenden können:

function Get-Something {
  <#
  .SYNOPSIS
  Describe the function here
  .DESCRIPTION
  Describe the function in more detail
  .EXAMPLE
  Give an example of how to use it
  .EXAMPLE
  Give another example of how to use it
  .PARAMETER computername
  The computer name to query. Just one.
  .PARAMETER logname
  The name of a file to write failed computer names to. Defaults to errors.txt.
  #>
  [CmdletBinding()]
  param
  (
    [Parameter(Mandatory=$True,
    ValueFromPipeline=$True,
    ValueFromPipelineByPropertyName=$True,
      HelpMessage='What computer name would you like to target?')]
    [Alias('host')]
    [ValidateLength(3,30)]
    [string[]]$computername,
        
    [string]$logname = 'errors.txt'
  )

  begin {
  write-verbose "Deleting $logname"
    del $logname -ErrorActionSilentlyContinue
  }

  process {

    write-verbose "Beginning process loop"

    foreach ($computer in $computername) {
      Write-Verbose "Processing $computer"
      # use $computer to target a single computer
    

      # create a hashtable with your output info
      $info = @{
        'info1'=$value1;
        'info2'=$value2;
        'info3'=$value3;
        'info4'=$value4
      }
      Write-Output (New-Object –TypenamePSObject –Prop $info)
    }
  }
}

Es gibt einige wichtige Dinge zu beachten Sie die Informationen zu dieser Funktion – von denen viele müssen Sie bei Verwendung dieser Vorlage anpassen:

  • Der Name der Funktion sieht wie ein Cmdlet-Name, beginnend mit einem der häufig verwendeten Windows PowerShell Verben wie "Get" und endend mit einem Nomen im singular.
  • Füllen Sie das Kommentar-basierte Hilfe. Geben Sie eine Beschreibung der einzelnen Parameter, eine Beschreibung der gesamten Funktion, und Beispiele, wie es verwendet wird. Führen Sie die Hilfe About_comment_based_help Weitere Informationen zum Schreiben von Hilfe auf diese Weise.
  • Der erste Parameter $Computername, ist relativ komplex. Es kann einen oder mehrere Werte für den Parameter oder aus der Pipeline akzeptieren. Es akzeptiert nur Werte, die drei bis 30 Zeichen lang sind. –Host können anstelle von angewiesen beim Ausführen der Funktion. Dieser Parameter ist obligatorisch. Wenn jemand die Funktion ohne Angabe eines Computernamens ausgeführt wird, wird die Shell, geben eine oder mehrere aufgefordert.
  • Der zweite Parameter $Logname, ist ein einfacher Parameter. Er akzeptiert nur einen String-Wert. Es hat auch einen Standardwert.
  • Der Skriptblock BEGIN versucht, eine vorhandene Protokolldatei zu löschen, so dass es sich bei jeder Ausführung einer hat die Funktion eine neue Protokolldatei.
  • Innerhalb des Skriptblocks PROCESS habe ich darauf hingewiesen, wenn Sie die Variable $Computer verwenden würden, damit Ihre funktioniert mit einem einzelnen Computer arbeiten. Sie arbeiten nicht mit $Computername direkt. Dieser Parameter kann einen oder mehrere Werte enthalten, damit die ForEach-Schleife diese zählt und nur nacheinander in $Computer für Sie stellt.
  • $Info Hashtable sollte das gewünschte Ausgabeformat enthalten. Betrachten Sie das als Tabellenausgabe. Ich habe die Spalten info1, info2, info3 und info4 erstellt. Die Werte für diese Spalten werden der Variablen $WertX entnommen. Dies ist nur ein Beispiel. Ich habe nicht tatsächlich setzen alles in diese Variablen in dieser Vorlage Sie $value1, $value2 usw. durch eigene Informationen ersetzen können.

Diese Vorlage eignet sich für eine erweiterte Funktion, die Informationen zu erhalten, aber nicht tatsächlich keine Änderungen an den Zustand des Systems muss. Für erweiterte Funktionen, die den Zustand des Systems ändern, müssen Sie ein paar zusätzliche Elemente implementieren. In diesem Sinne ist hier eine zweite Vorlage:

function Do-Something {
  <#
  .SYNOPSIS
  Describe the function here
  .DESCRIPTION
  Describe the function in more detail
  .EXAMPLE
  Give an example of how to use it
  .EXAMPLE
  Give another example of how to use it
  .PARAMETER computername
  The computer name to query. Just one.
  .PARAMETER logname
  The name of a file to write failed computer names to. Defaults to errors.txt.
  #>
  [CmdletBinding(SupportsShouldProcess=$True,ConfirmImpact='Low')]
  param
  (
    [Parameter(Mandatory=$True,
    ValueFromPipeline=$True,
    ValueFromPipelineByPropertyName=$True,
      HelpMessage='What computer name would you like to target?')]
    [Alias('host')]
    [ValidateLength(3,30)]
    [string[]]$computername,
        
    [string]$logname = 'errors.txt'
  )

  begin {
  write-verbose "Deleting $logname"
    del $logname -ErrorActionSilentlyContinue
  }

  process {

    write-verbose "Beginning process loop"

    foreach ($computer in $computername) {
      Write-Verbose "Processing $computer"
      if ($pscmdlet.ShouldProcess($computer)) {
        # use $computer here
      }
    }
  }
}

In dieser Vorlage müssen Sie die Einstellung "ConfirmImpact" zu ändern. Sie müssen eine relative Angabe der potenziellen Gefahr Ihrer erweiterten Funktion geben. Beispielsweise könnte etwas kleinere, z. B. das Ändern einer Datei ReadOnly-Attribut eine ConfirmImpact von "Niedrig" bewerten Neustart des Computers möglicherweise eine ConfirmImpact von "Hoch". Windows PowerShell verwendet diese Einstellung zusammen mit der Shell integrierte $ConfirmPreference-Variable, um zu bestimmen, ob Eingabeaufforderungen "Sind Sie sicher?" automatisch bereitgestellt, wenn Sie die Funktion ausführen.

Es wurde festgestellt, wo Sie tatsächlich Ihre Aktion durchführen sollten $Computer um einen einzelnen Computer als Ziel verwenden. Ist in einem Konstrukt "If" Zeichenketten-integrierte $Pscmdlet-Objekts verwendet. Wenn diese Funktion Parameter WhatIf oder Confirm ausgeführt wird (die unterstützt wird), übernimmt das Objekt $Pscmdlet die Ausgabe "Was wäre wenn", oder generieren die Eingabeaufforderungen "Sind Sie sicher?".

Beide Vorlagen werden unterstützen den verbose-Parameter, und Write-Verbose verwenden, um Statusmeldungen zu generieren, wie die Funktion ausführt. Natürlich müssen nicht jede Funktion auf Zielcomputern. Manchmal müssen Sie Parameter, Dateinamen, Benutzernamen oder andere Informationen zu akzeptieren. Ändern Sie einfach die Parameterdeklarationen entsprechend.

Finden Sie weitere Informationen über die Parameterattribute – z. B. Validierungen, obligatorisch, pipeline Input und so weiter – durch Ausführen von About_functions_advanced_parameter in der Shell-Hilfe. Viel Spaß.

Don Jones

Don Jonesist eine beliebte Windows PowerShell Autor, Trainer und Lautsprecher. Sein neuestes Buch heißt "Erfahren Sie Windows PowerShell in einem Monat von Rezepten" (Manning, 2011); Besuchen Sie MoreLunches.com für Infos und kostenlose Companion Content. Er steht auch für vor-Ort-Schulungen (Besuchen Sie ConcentratedTech.com/training für Weitere Informationen).

Verwandter Inhalt