Suche…


Einführung

Eine Funktion ist im Wesentlichen ein benannter Codeblock. Wenn Sie den Funktionsnamen aufrufen, wird der Skriptblock innerhalb dieser Funktion ausgeführt. Es ist eine Liste von PowerShell-Anweisungen, deren Name Sie zuweisen. Wenn Sie eine Funktion ausführen, geben Sie den Funktionsnamen ein. Mit dieser Methode können Sie Zeit sparen, wenn Sie sich wiederholende Aufgaben lösen. PowerShell formatiert sich in drei Teilen: Das Schlüsselwort 'Function', gefolgt von einem Namen, und schließlich die Nutzdaten, die den Skriptblock enthalten, der von einer geschweiften Klammer mit geschweiften Klammern umgeben ist.

Einfache Funktion ohne Parameter

Dies ist ein Beispiel für eine Funktion, die eine Zeichenfolge zurückgibt. Im Beispiel wird die Funktion in einer Anweisung aufgerufen, die einer Variablen einen Wert zuweist. Der Wert ist in diesem Fall der Rückgabewert der Funktion.

function Get-Greeting{
    "Hello World"
}

# Invoking the function
$greeting = Get-Greeting

# demonstrate output
$greeting
Get-Greeting

function deklariert den folgenden Code als Funktion.

Get-Greeting ist der Name der Funktion. Jedes Mal, wenn diese Funktion im Skript verwendet werden muss, kann die Funktion aufgerufen werden, indem sie nach Namen aufgerufen wird.

{ ... } ist der Skriptblock, der von der Funktion ausgeführt wird.

Wenn der obige Code in der ISE ausgeführt wird, würden die Ergebnisse wie folgt aussehen:

Hello World
Hello World

Grundparameter

Eine Funktion kann mit Parametern über den Parameterblock definiert werden:

function Write-Greeting {
    param(
        [Parameter(Mandatory,Position=0)]
        [String]$name,
        [Parameter(Mandatory,Position=1)]
        [Int]$age
    )
    "Hello $name, you are $age years old."
}

Oder mit der einfachen Funktionssyntax:

function Write-Greeting ($name, $age) {
    "Hello $name, you are $age years old."
}

Hinweis: Casting-Parameter sind für beide Arten von Parameterdefinitionen nicht erforderlich.

Die Simple Function Syntax (SFS) hat im Vergleich zum Parameterblock sehr eingeschränkte Möglichkeiten.
Sie können zwar Parameter definieren, die in der Funktion [CmdletBinding()] , Sie können jedoch keine Parameterattribute angeben, Parameter Validation verwenden , [CmdletBinding()] mit SFS (und dies ist keine erschöpfende Liste) verwenden.

Funktionen können mit geordneten oder benannten Parametern aufgerufen werden.

Die Reihenfolge der Parameter beim Aufruf entspricht der Reihenfolge der Deklaration im Funktionsheader (standardmäßig) oder kann mithilfe des Position angegeben werden (wie im Beispiel für erweiterte Funktionen oben gezeigt).

$greeting = Write-Greeting "Jim" 82

Alternativ kann diese Funktion mit benannten Parametern aufgerufen werden

$greeting = Write-Greeting -name "Bob" -age 82

Pflichtparameter

Parameter einer Funktion können als obligatorisch markiert werden

function Get-Greeting{
    param
    (
        [Parameter(Mandatory=$true)]$name
    )
    "Hello World $name"
}

Wenn die Funktion ohne Wert aufgerufen wird, werden Sie in der Befehlszeile nach dem Wert gefragt:

$greeting = Get-Greeting 

cmdlet Get-Greeting at command pipeline position 1
Supply values for the following parameters:
name: 

Erweiterte Funktion

Dies ist eine Kopie des erweiterten Funktions-Snippets der Powershell ISE. Im Grunde ist dies eine Vorlage für viele der Dinge, die Sie mit erweiterten Funktionen in Powershell verwenden können. Wichtige Punkte zu beachten:

  • get-help-Integration: Der Anfang der Funktion enthält einen Kommentarblock, der so eingerichtet ist, dass er vom Cmdlet get-help gelesen werden kann. Der Funktionsblock kann sich am Ende befinden, falls gewünscht.
  • Die Funktion "Cmdletbinding" verhält sich wie ein Cmdlet
  • Parameter
  • Parametersätze
<#
.Synopsis
   Short description
.DESCRIPTION
   Long description
.EXAMPLE
   Example of how to use this cmdlet
.EXAMPLE
   Another example of how to use this cmdlet
.INPUTS
   Inputs to this cmdlet (if any)
.OUTPUTS
   Output from this cmdlet (if any)
.NOTES
   General notes
.COMPONENT
   The component this cmdlet belongs to
.ROLE
   The role this cmdlet belongs to
.FUNCTIONALITY
   The functionality that best describes this cmdlet
#>
function Verb-Noun
{
    [CmdletBinding(DefaultParameterSetName='Parameter Set 1', 
                  SupportsShouldProcess=$true, 
                  PositionalBinding=$false,
                  HelpUri = 'http://www.microsoft.com/',
                  ConfirmImpact='Medium')]
    [Alias()]
    [OutputType([String])]
    Param
    (
        # Param1 help description
        [Parameter(Mandatory=$true, 
                   ValueFromPipeline=$true,
                   ValueFromPipelineByPropertyName=$true, 
                   ValueFromRemainingArguments=$false, 
                   Position=0,
                   ParameterSetName='Parameter Set 1')]
        [ValidateNotNull()]
        [ValidateNotNullOrEmpty()]
        [ValidateCount(0,5)]
        [ValidateSet("sun", "moon", "earth")]
        [Alias("p1")] 
        $Param1,

        # Param2 help description
        [Parameter(ParameterSetName='Parameter Set 1')]
        [AllowNull()]
        [AllowEmptyCollection()]
        [AllowEmptyString()]
        [ValidateScript({$true})]
        [ValidateRange(0,5)]
        [int]
        $Param2,

        # Param3 help description
        [Parameter(ParameterSetName='Another Parameter Set')]
        [ValidatePattern("[a-z]*")]
        [ValidateLength(0,15)]
        [String]
        $Param3
    )

    Begin
    {
    }
    Process
    {
        if ($pscmdlet.ShouldProcess("Target", "Operation"))
        {
        }
    }
    End
    {
    }
}

Parameterüberprüfung

Es gibt verschiedene Möglichkeiten, um die Parametereintragung in PowerShell zu überprüfen.

Anstatt Code in Funktionen oder Skripts zu schreiben, um Parameterwerte zu überprüfen, werden diese ParameterAttributes ausgegeben, wenn ungültige Werte übergeben werden.

ValidateSet

Manchmal müssen wir die möglichen Werte einschränken, die ein Parameter annehmen kann. Angenommen, wir möchten für den Parameter $Color in einem Skript oder einer Funktion nur Rot, Grün und Blau zulassen.

Wir können das Parameterattribut ValidateSet , um dies einzuschränken. Dies hat den zusätzlichen Vorteil, dass beim Festlegen dieses Arguments (in einigen Umgebungen) das Ausfüllen der Registerkarten zugelassen wird.

param(
    [ValidateSet('red','green','blue',IgnoreCase)]
    [string]$Color
)

Sie können auch IgnoreCase angeben, um die Groß- / Kleinschreibung zu deaktivieren.

ValidateRange

Diese Methode der Parametervalidierung erfordert einen minimalen und maximalen Int32-Wert und erfordert, dass der Parameter innerhalb dieses Bereichs liegt.

param(
    [ValidateRange(0,120)]
    [Int]$Age
)

ValidatePattern

Diese Methode der Parameterüberprüfung akzeptiert Parameter, die dem angegebenen Regex-Muster entsprechen.

param(
    [ValidatePattern("\w{4-6}\d{2}")]
    [string]$UserName
)

ValidateLength

Diese Methode der Parameterüberprüfung prüft die Länge der übergebenen Zeichenfolge.

param(
    [ValidateLength(0,15)]
    [String]$PhoneNumber
)

ValidateCount

Diese Methode der Parameterüberprüfung prüft die Anzahl der übergebenen Argumente, z. B. in einem String-Array.

param(
    [ValidateCount(1,5)]
    [String[]]$ComputerName
)

ValidateScript

Schließlich ist die ValidateScript-Methode außerordentlich flexibel, indem ein Skriptblock mit $ _ ausgewertet wird, um das übergebene Argument darzustellen. Es übergibt dann das Argument, wenn das Ergebnis $ true ist (einschließlich aller Ausgaben als gültig).

Dies kann verwendet werden, um zu testen, ob eine Datei vorhanden ist:

param(
    [ValidateScript({Test-Path $_})]
    [IO.FileInfo]$Path 
)

So prüfen Sie, ob ein Benutzer in AD vorhanden ist:

param(
    [ValidateScript({Get-ADUser $_})]
    [String]$UserName
)

Und so ziemlich alles, was Sie schreiben können (da es nicht auf Oneliners beschränkt ist):

param(
    [ValidateScript({
        $AnHourAgo = (Get-Date).AddHours(-1)
        if ($_ -lt $AnHourAgo.AddMinutes(5) -and $_ -gt $AnHourAgo.AddMinutes(-5)) {
            $true
        } else {
            throw "That's not within five minutes. Try again."
        }
    })]
    [String]$TimeAboutAnHourAgo
)


Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow