Möglichkeiten zum Bereinigen meiner Ja/Nein-Eingabeaufforderungen in Powershell

Möglichkeiten zum Bereinigen meiner Ja/Nein-Eingabeaufforderungen in Powershell

Also, für die Arbeit gaben sie mir dieses „Automatisierungs“-Skript, das sie verwenden wollten. Aber ich habe buchstäblich noch nie etwas in Powershell geschrieben, also habe ich natürlich das Ganze von Grund auf neu geschrieben, weil es toll war (nicht, dass meins viel besser wäre), aber nach 5 Tagen Powershell-Erfahrung denke ich, dass ich anständige Fortschritte gemacht habe. Meine Ja/Nein-Eingabeaufforderungen werden jedoch ziemlich chaotisch und ich hoffe, dass die Leute, die hier wirklich wissen, was sie tun, ein paar Tipps für mich haben. Also, hier ist mein Code.

Das sind die prompten Erklärungen...

    $yes = New-Object System.Management.Automation.Host.ChoiceDescription "&yes"
    $no = New-Object System.Management.Automation.Host.ChoiceDescription "&no"
    $help = New-Object System.Management.Automation.Host.ChoiceDescription "&help"
    $options = [System.Management.Automation.Host.ChoiceDescription[]]($yes, $no, $help)


These are part of the checks for the Datacenter portion. (The whole script block is Datacenters, Clusters, Hosts utilizing VMware PowerCLI.)

    While ($ChoiceTask -eq "Check Datacenters"){
        Clear-Host
        Write-Output "Would you like to create any Datacenters?"
            $result = $host.ui.PromptForChoice($title, $message, $options, 0)
                switch($result){
                    0{$ChoiceTask = "Datacenters"
                    $MadeDatacenters = $true}
                    1{$ChoiceTask = "Check Clusters"
                    $MadeDatacenters = $false}
                    2{
                Write-Output "A virtual datacenter is a container for all the inventory objects required to
    complete a fully functional environment for operating virtual machines.
    Recommended procedure is creating three datacenters. The UCS Datacenter, the vSAN
    Datacenter, and the Witness Datacenter. However, you may change this to fit your needs."
                Read-Host -Prompt "(Press 'Enter' to continue)"
                    }
                }
    }

    #Creates appropriate amount of Datacenters for User

    While ($ChoiceTask -eq "Datacenters"){
        Clear-Host
        $DataCenterAmount = ([String] $DataCenterAmount = (Read-Host "How many datacenters would you like to create?"))
        Clear-Host
        Write-Color -Text "You want to create ","$DataCenterAmount ","Datacenters. Is this correct?" -Color White,Yellow,White
        $result = $host.ui.PromptForChoice($title, $message, $options, 1)
            switch ($result){
                0{
                    Clear-Host
                    [System.Collections.ArrayList]$DatacenterArray = @()
                    $Curr = 1
                    While ($Curr -le $DataCenterAmount){ #Processes amount of datacenters to be created.
                        Write-Color -Text "Please enter the name of Datacenter ","$Curr",":" -Color White,Yellow,White
                        $DatacenterName = Read-Host
                        Clear-Host
                        Write-Color -Text "The name of Datacenter"," $Curr"," is"," $DatacenterName",". Is this correct?" -Color White,Yellow,White,Yellow,White
                        $result = $host.ui.PromptForChoice($title, $message, $options, 1)
                            switch ($result){
                                0{ #After confirmation of Datacenter name - creates datacenter
                                $folder = Get-Folder -NoRecursion
                                try {
                                New-Datacenter -Name $DatacenterName -Location $folder
                                }
                                catch{
                                    Clear-Host
                                    Write-Color -text "[WARNING] An error has occured during the Datacenter creation process, a connection error may have ocurred." -color red
                                    Read-Host "(Press 'Enter' to continue:)"
                                    $ChoiceTask = "Standard Check"
                                }
                                $DatacenterArray.Add($DatacenterName)
                                Clear-Host
                                Write-Color -Text "Datacenter"," $DatacenterName"," successfully created! (Press 'Enter' to continue)" -Color White,Yellow,White
                                Read-Host
                                $Curr++
                                Clear-Host
                                }
                                1{}
                            }
                    }
                $ChoiceTask = "Check Clusters"
                }#End 'Yes' Selection
                1{}
            }
    }

Wie Sie sehen, wird es wirklich chaotisch. Aber es ist wichtig, dass der Benutzer sicherstellt, dass seine Auswahl richtig ist. Soweit ich das beurteilen kann, ist dies die beste Methode zur Ja/Nein-Abfrage, aber ich möchte das für mich selbst wirklich aufräumen. Wenn Sie das oben Gesagte übersehen haben, geschieht dies in Verbindung mit VMwares PowerCLI. Wenn Sie also einige Aktionen nicht erkennen, ist das der Grund. Und write-color ist eine benutzerdefinierte Funktion, um die Farbgebung von auf dem Bildschirm gedruckten Variablen zu vereinfachen. Obwohl ich sicher bin, dass es auch dafür einen viel einfacheren Weg gibt.

Antwort1

VerwendenSpritzenum lange/große Parametersätze zu übergeben und so die Lesbarkeit zu verbessern:

$splat = @{
  'Text' = ('The name of Datacenter ', $Curr, ' is ', $DatacenterName, '. Is this correct?')
  'Color' = (White,Yellow,White,Yellow,White)
}
Write-Color -Text $Text -Color $Color

Betrachten Sie eine Wrapper-Funktion:

Function Ask-ColoredQuestion ($Text, $Color) {
   Write-Color -Text $Text -Color $Color
   $host.ui.PromptForChoice($title, $message, $options, 0)
}

$splat = @{
  'Text' = ('The name of Datacenter ', $Curr, ' is ', $DatacenterName, '. Is this correct?')
  'Color' = (White,Yellow,White,Yellow,White)
}

$Result = Ask-ColoredQuestion @splat

Noch besser,Die Textfarbe kann über Escape-Codes gesteuert werden, die Teil Ihrer Zeichenfolge sein können. Dadurch können Sie den eingebauten -PromptParameter von Read-Hostoder $messagein verwendenPromptForChoice()

$esc = "$([char]27)"
$Red = "$esc[31m"
$Green = "$esc[32m"
$message = '{0}{1} {2}{3}' -f $Red, 'Hello', $Green, 'World'
$message

Bildbeschreibung hier eingeben

Daher möchten Sie möglicherweise das Tool umgestalten, Write-Colorum eine Zeichenfolge mit Farb-Escape-Codes zusammenzustellen und diese Zeichenfolge dann an die integrierten Eingabeaufforderungen zu übergeben.

Ich denke, das reicht für den Anfang! :D

Antwort2

Ich habe festgestellt, dass ich viele Eingabeaufforderungen für Ja/Nein-Antworten verwendet habe. Deshalb habe ich eine Funktion geschrieben, um es einfacher zu machen. Dies kann Ihnen ein paar Tipps geben, aber Sie möchten vielleicht meine Bemühungen verbessern.

<#
.SYNOPSIS
    Prompts user for answer to a yes no prompt.
.DESCRIPTION
    The user is prompted with the argument, and asked for a reply.
    If the reply matches YES or NO (case insensitive) the value is true
    or false.  Otherwise, the user is prompted again.
#>
function ask-user {
    [CmdletBinding()]
    Param (
       [Parameter(Mandatory=$true)]
       [string] $question
    )
    Process {
       $answer = read-Host $question
       if ("YES","YE","Y" -contains $answer) {$true}
       elseif ("NO", "N" -contains $answer) {$false}
       else {ask-user $question}
    }
} # End function ask-user

verwandte Informationen