Arbeiten mit Interaktiven Eingabeaufforderungen in PowerShell

März 25, 2018 Sicherheit und Compliance, MOVEit

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

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.

Tipp: Lesen Sie dazu auch das Whitepaper Automatisieren mit PowerShell oder laden Sie sich kostenfrei eine Testversion von MOVEit Automation, Software für die Automatisierung der sicheren Dateiübertragung, herunter.

Adam Bertram

 

Adam Bertram ist seit 20 Jahren in der IT-Branche tätig und arbeitet aktuell als Automatisierungs-Ingenieur, Blogger und selbstständiger Consultant und Autor, und Ausbilder. Sein Schwerpunkt liegt dabei auf DevOps, System-Management und Automatisierungs-Technologien, sowie auf zahlreichen Cloud-Plattformen. Er ist ein Microsoft Cloud und Datacenter Management MVP und ist dafür bekannt effizient zu arbeiten. Außerdem liebt er es anderen Leuten die Welt der Automatisierung näherzubringen.

Read next Benutzung der neuen MOVEit 2018 REST API mit PowerShell