<img height="1" width="1" style="display:none" src="https://www.facebook.com/tr?id=1678611822423757&amp;ev=PageView&amp;noscript=1">
Defrag This

| Read. Reflect. Reboot.

Arbeiten mit Interaktiven Eingabeaufforderungen in PowerShell

Adam Bertram| March 26 2018

| IT insights

interactive-prompts-powershell

In diesem PowerShell Tutorial werde ich Ihnen einige Möglichkeiten zeigen, wie Sie Ihre Benutzer zu Eingaben auffordern können.

interactive-prompts-powershell-sq.jpg

PowerShell ist eine leistungsstarke Skriptingsprache, die eine Menge leisten kann, aber sie ist natürlich nicht telepathisch. Wenn Sie in Ihrem Skript nicht die Anweisungen geben, weiß PowerShell nicht, ob Sie den Dateipfad A oder B oder eine virtuelle Maschine namens DC meinten oder ob Sie wirklich ein gesamtes Datenzentrum herunterfahren wollen.

Es ist immer eine gute Idee, diese “Fragen” aus Ihrer Code-Logik durch Parameter herauszuhalten. Wenn Sie Parametereingaben zur Verfügung stellen, kann der Benutzer die Werte in den Code eingeben ohne ihn in irgendeiner Weise zu verändern. Der Benutzer muss jedoch daran denken, Parameter zu benutzen und Parameter können nicht benutzt werden, wenn sie ersteinmal in einem Skript oder einer Funktion drin sind. Um Eingaben in ein Skript oder eine Funktion zu geben, hat man eine andere Möglichkeit, nämlich die interaktiven Eingabeaufforderungen.

Es gibt einige Möglichkeiten, den Benutzer interaktiv aufzufordern, Eingaben einzugeben:

  • Obligatorische Parameter
  • Read-Host
  • Die Methode PromptForChoice .NET

Related: Building PowerShell Scripts To Tie Disparate Products Together

Obligatorische Parameter

Wenn Sie eine Funktion oder ein Skript mit einem Parameter geschrieben haben, kann dieser Parameter so gesetzt werden, dass er einen obligatorischen Wert benötigt, bevor die Funktion/das Skript laufen kann. Zum Beispiel:

function Start-Server {
    param(
        [Parameter(Mandatory)]
        [string]$Name
    )
    Write-Output "Server name $Name was started"
}

Wenn die Funktion ohne den Parameter „Name“ ausgeführt wird, werden Sie so etwas wie im unteren Beispiel sehen und Sie werden aufgefordert, einen Wert einzugeben. Hier stoppen wir die Skriptausführung, um die Werte vom Benutzer zu erfragen.

PS> Start-Server

cmdlet Start-Server at command pipeline position 1
Supply values for the following parameters:
Name:

Read-Host

PowerShell hat ein Kommando namens Read-Host, das die Skriptausführung anhält und nach einem Wert fragt, der irgendwo im Skript eingefügt werden kann. Wenn dieses Kommando innerhalb des Skripts ausgeführt wird, stoppt es die Ausführung und präsentiert eine optionale Eingabeaufforderung in der Konsole und akzeptiert einen Wert vom Benutzer. Read-Host ist ideal, um Werte zu erfassen während das Skript läuft und dann diese Werte Variablen zuzuordnen. In dem obenstehenden Beispiel möchte ich vielleicht dem Benutzer die Möglichkeit geben, den Start des Servers um X Sekunden zu verzögern. Daher benutze ich die Eingabeaufforderung, um nach einem Sekundenwert mit Read-Host zu fragen, wie in dem Beispiel unten gezeigt.

function Start-Server { param( [Parameter(Mandatory)][string]$Name ) $DelayinSeconds = Read-Host -Prompt 'How manys seconds to delay until server starts?' Write-Output "Server name $Name will be delayed by $DelayInSeconds seconds." } ```

Ich führe diese Funktion jetzt aus und sehe dann folgendes:

PS> Start-Server

cmdlet Start-Server at command pipeline position 1
Supply values for the following parameters:
Name: MyServer
How many seconds to delay until server starts?: 10
Server name MyServer will be delayed by 10 seconds.

Beachten Sie, dass die Benutzung von Read-Host immer obligatorisch ist.  Es gibt keine Möglichkeit einen voreingegebenen Wert bereitzustellen, wie man das bei der Benutzung von Parametern machen kann. 

Die Methode PromptForChoice .NET

Dann gibt es noch eine Methode, die nicht zu PowerShell, sondern zu.NET gehört. Diese Methode benutzt das Objekt System.Management.Automation.Host.ChoiceDescription und wird benutzt, um Ja/Nein-Fragen für die Eingabe zu erstellen.

 

Unter Benutzung des obenstehenden Beispiels möchte ich dem Benutzer die Wahl geben, die Verzögerung einzugeben oder nicht. Wenn der Server sofort gestartet werden soll, wird das Skript weiterlaufen und genau dies machen. Ich muss den Benutzer nach einer Ja/Nein-Antwort fragen, ob eine Verzögerung gesetzt werden soll oder nicht. Im unteren Beispiel sehen Sie, wie man das macht.

function Start-Server {
    param(
        [Parameter(Mandatory)]
        [string]$Name
    )

    $yes = New-Object System.Management.Automation.Host.ChoiceDescription '&Yes', 'Allows setting a delay'
    $no = New-Object System.Management.Automation.Host.ChoiceDescription '&No', 'Does not allow setting a delay'
    $options = [System.Management.Automation.Host.ChoiceDescription[]]($yes, $no)
    $result = $host.ui.PromptForChoice('Set Delay?', 'Would you like to set a delay?', $options, 0)

    switch ($result)
        {
            0 {
                $DelayinSeconds = Read-Host -Prompt 'How manys seconds to delay until server starts?'
                $message = "Server name $Name will be delayed by $DelayInSeconds seconds."
            }
            1 {
                $message = "Server name $Name will not be delayed."
            }
        }
    Write-Output $message
}

Executing this function would give you:

PS> Start-Server

cmdlet Start-Server at command pipeline position 1
Supply values for the following parameters:
Name: MyServer
Set Delay?
Would you like to set a delay?
[Y] Yes  [N] No  [?] Help (default is "Y"): n
Server name MyServer will not be delayed.

Beachten Sie, dass Sie automatisch die Linie [Y] Yes  [N] No  [?] Help (Voreinstellung ist "Y"): bekommen haben, ohne sie selbst erstellen zu müssen. Hier benutzt man die nativen Möglichkeiten von der Methode PromptForChoice, um dem Benutzer eine nativ-aussehende Benutzererfahrung zu geben.

Topics: IT insights

Leave a Reply

Your email address will not be published. Required fields are marked *

THIS POST WAS WRITTEN BY Adam Bertram

Adam Bertram is a 20-year veteran of IT. He’s currently an automation engineer, blogger, independent consultant, freelance writer, author, and trainer. Adam focuses on DevOps, system management, and automation technologies as well as various cloud platforms. He is a Microsoft Cloud and Datacenter Management MVP and efficiency nerd that enjoys teaching others a better way to leverage automation.

Free Trials

Getting started has never been easier. Download a trial today.

Download Free Trials

Contact Us

Let us know how we can help you. Focus on what matters. 

Send us a note

Subscribe to our Blog

Let’s stay in touch! Register to receive our blog updates.