Powershell Switch Case mit Wertübergabe

sniper8952

Banned
Registriert
Juni 2008
Beiträge
355
Hallo zusammen

ich habe folgendes Problem. Ich möchte das wenn ich am Ende der Schleife bin dann mir der Wert $Ergebnis als Text (Das ist ein Auto) ausgegeben wird und nicht als die ausgewählte Zahl. Wieso klappt das nicht?

while(($Ergebnis = Read-Host "Bitte Wähle") -notin '1' '2')
{
switch ($Ergebnis)
{
1 { $Ergebnis = "Das ist ein Auto" ; break }
2 { $Ergebnis = "Das ist ein Zug" ; break }
default {"Ungültige Eingabe}
}}
LG Sniper8952
 
PowerShell:
while(($ergebnis = Read-Host "Bitte wähle")) {
    switch ($ergebnis) {
        1 { "Das ist ein Auto"; break 1 }
        2 { "Das ist ein Zug"; break 1 }
        default { "Ungültige Eingabe" }
    }
}
 
Leider ist das nicht genau das was ich benötige. Der Text sollte danach in der Variable $Ergebnis (auch ausserhalb der while schleife gespeichert werden. Wenn ich nämlich dort die Variable $Ergebnis aufrufe erhalte ich die Zahl 1 bzw 2. Je nachdem was ich ausgewählt habe.
 
PowerShell:
while(($Ergebnis = Read-Host "Bitte Wähle") -notin '1', '2')
{
switch ($Ergebnis)
{
1 { $Ergebnis = "Das ist ein Auto" ; break }
2 { $Ergebnis = "Das ist ein Zug" ; break }
default {"Ungültige Eingabe"}
}}
If($Ergebnis -Like '1'){$Ergebnis = "Das ist ein Auto"}
ElseIf($Ergebnis -Like '2'){$Ergebnis = "Das ist ein Zug"}
$Ergebnis
 
PowerShell:
$check = $false
while($check -eq $false){
    $eingabe = Read-Host "Bitte Wähle"
    switch($eingabe){
        "1"{$ergebnis = "Das ist ein Auto"; $check = $true}
        "2"{$ergebnis = "Das ist ein Zug"; $check = $true}
        default {"Ungültige Eingabe"}
    }
}
write-host $ergebnis
oder Du konkatenierst die Strings, um es dynamischer zu gestalten:
PowerShell:
$ergebnis = "Das ist ein "
$check = $false
while($check -eq $false){
    $eingabe = Read-Host "Bitte Wähle"
    switch($eingabe){
        "1"{$ergebnis += "Auto"; $check = $true}
        "2"{$ergebnis += "Zug"; $check = $true}
        default {"Ungültige Eingabe"}
    }
}
write-host $ergebnis
 
  • Gefällt mir
Reaktionen: sniper8952
Vielen Dank AEmoteyon

Ich habe es nun so gelöst:

#Switch Statement
while ($ergebnis = ' ')
{
$frage = Read-Host "Bitte wähle"
switch ($frage)
{
1 { $ergebnis = "Das ist ein Auto"; break 1 }
2 { $ergebnis = "Das ist ein Zug"; break 1 }
default {"Ungültige Eingabe"}
}
}
#Das Ergebnis wird in dieser Variabel festgehalten
$ergebnis
 
Also rein vom .net Unterbau kommend würd ich einfach mal behaupten du hast ein Scope Problem.

----
Einschub Nachtrag:
Ich korrigiere mich mal. Scope kanns trotzdem sein, aber dein größeres Problem ist, dass du alles in der Schleife machst. Die While ist kopfgesteuert. Sobald die Bedingung erfüllt wird, wird die abgebrochen und nicht durchlaufen. Dein switch wird gar nicht mehr ausgeführt.
Selbiges würde umgedreht auch bei ein Do While passieren.
Du musst also stumpf den restlichen Code außerhalb der While setzen und fertig. Komplexe Konstrukte sind unnötig.
Nachtrag Ende
-----

Einfach bissl umbauen und gut. Aber so eine Kata kann ja jeder anders lösen. :D
PowerShell:
while(($Ergebnis = Read-Host "Bitte Wähle") -notin '1', '2' )
{
    "Ungültige Eingabe"
}
switch ($Ergebnis)
    {
        1 { $Ergebnis = "Das ist ein Auto"; break }
        2 { $Ergebnis = "Das ist ein Zug"; break }
        default { break }
    }
$Ergebnis

Vom Prinzip ist dein Switch auch unnötig da dein While ja exakt zwei Möglichkeiten definiert. Wenn die Aufgabe so definiert ist genügt ein If Else
PowerShell:
while(($Ergebnis = Read-Host "Bitte Wähle") -notin '1', '2' )
{
    "Ungültige Eingabe"
}
$Ergebnis = If($Ergebnis -eq '1') {"Das ist ein Auto"} Else {"Das ist ein Zug"}
$Ergebnis

Mit Powershell 7 geht dann wohl auch der ternäre Operator. Hab ich aber eben nicht getestet
PowerShell:
$Ergebnis = $Ergebnis -eq '1' ? {"Das ist ein Auto"} : {"Das ist ein Zug"}
 
Zuletzt bearbeitet:
morcego schrieb:
Darauf wollte ich mit meinem Beitrag auch hinaus. Meine Ausführung ist etwas umständlicher und nicht so gut gelöst wie dein Vorschlag. Deiner trifft es auf den Punkt und so würde ich das auch umsetzen.

Hier noch zwei Lösungsvorschläge von mir, die Antwort der Abfrage erfolgt nicht über die Eingabe, sondern
mit Mausklick in einer MessageBox.

Mit einer Auswahl von zwei Antworten:

PowerShell:
$title = "Frage ..."
$message = "Das auf dem Bild ist ..."
$option1 = New-Object System.Management.Automation.Host.ChoiceDescription "&ein Auto"
$option2 = New-Object System.Management.Automation.Host.ChoiceDescription "&ein Zug"
$options = [System.Management.Automation.Host.ChoiceDescription[]]($option1, $option2)
cls
$result = $host.ui.PromptForChoice($title, $message, $options, 0)
Switch($result)
{
   0 {Write-Host  "'Hund' ist die richtige Antwort! Gut gemacht!" -foregroundcolor green}
   1 {Write-Host  "'Zug' ist die total falsche Antwort! Kind, konzentrier' dich!" -foregroundcolor red}
}

Mit einer erweiterterten Auswahl:

PowerShell:
$title = "Frage ..."
$message = "Das auf dem Bild ist ..."
$option1 = New-Object System.Management.Automation.Host.ChoiceDescription "&ein Hund"
$option2 = New-Object System.Management.Automation.Host.ChoiceDescription "&ein Zug"
$option3 = New-Object System.Management.Automation.Host.ChoiceDescription "&eine Katze"
$option4 = New-Object System.Management.Automation.Host.ChoiceDescription "&ein Flugzeug"
$options = [System.Management.Automation.Host.ChoiceDescription[]]($option1, $option2, $option3, $option4)
cls
$result = $host.ui.PromptForChoice($title, $message, $options, 0)
Switch($result)
{
   0 {Write-Host  "'Hund' ist die richtige Antwort! Gut gemacht!" -foregroundcolor green}
   1 {Write-Host  "'Zug' ist die total falsche Antwort! Kind, konzentrier' dich!" -foregroundcolor red}
   2 {Write-Host  "Die Antwort 'Katze' ist knapp daneben, aber knapp daneben ist halt trotzdem vorbei!" -foregroundcolor red}
   3 {Write-Host  "Ein 'Flugzeug' ist es sicher nicht! Setzen -6" -foregroundcolor red}
}

(1)Screenshot 2023-01-13.png


(2)Screenshot 2023-01-13.png
 
Zuletzt bearbeitet von einem Moderator:
  • Gefällt mir
Reaktionen: sniper8952
Ich habe jetzt mal meinen letzten Beitrag editiert und dort einen weiteren Lösungsvorschlag eingestellt.
Ich denke, so kann man es durchaus machen ...^^
 
  • Gefällt mir
Reaktionen: sniper8952
Zurück
Oben