嘿伙计们我还在试图弄清楚如何以正确的方式为我的脚本使用循环。
现在唯一的问题是,当开关开始并且我不选择任何选项(1,2或Q)时,它跳转到写入“loop Done”的第二部分。
当Loop完成一次后我遇到了同样的问题,我被问到是否要使用R或Q重复或退出。
有没有办法避免这种情况?如果我不使用1,2,R或Q,可以让我返回菜单的中断或其他命令?
function Show-Menu
{
([string]$Title = '? ')
cls
Write-Host "================ $Title ================"
Write-Host "1: Wählen Sie '1' für $F1"
Write-Host "2: Wählen Sie '2' für $F2"
Write-Host "Q: Wählen Sie 'Q' zum Beenden."
}
$F1 = "Test1"
$F2 = "Test2"
do
{
Show-Menu
$input = Read-Host "Bitte wählen Sie aus."
switch ($input)
{
'1' {
$vorname = Read-Host "Bitte Vornamen eingeben:"
$name = Read-Host "Bitte Namen eingeben:"
$short = Read-Host "Bitte Kürzel eingeben:"
}
'2' {
$short = Read-Host "Bitte Benutzernamen eingeben:"
$info = Read-Host -Prompt 'Bitte Beschreibung eingeben.'
}
'q' {
return
}
}
do
{
Write-Host "Loop done"
Clear-Variable -Name vorname,short,name,info
$response = Read-Host "Drücken Sie R zum Wieder holen, Q zum Beenden"
if ($response -eq "Q")
{
exit
}
} until ($response -eq "R")
} until ($input -eq 'q')
答案 0 :(得分:1)
您可以在获取switch
之前检查变量,如果找不到任何预期值,则可以检查continue
。
在交换机中使用default
块会更优雅地处理这个问题,但发现continue
/ break
适用于最内部的块(如预期的那样),而不是外do
块。
function Show-Menu
{
(
[string]$Title = '? '
)
cls
Write-Host "================ $Title ================"
Write-Host "1: Wählen Sie '1' für $F1"
Write-Host "2: Wählen Sie '2' für $F2"
Write-Host "Q: Wählen Sie 'Q' zum Beenden."
}
$F1 = "Test1"
$F2 = "Test2"
do
{
Show-Menu
$input = Read-Host "Bitte wählen Sie aus."
if($input -notin @(1,2,"q")){
Continue
}
switch ($input)
{
'1' {
$vorname = Read-Host "Bitte Vornamen eingeben:"
$name = Read-Host "Bitte Namen eingeben:"
$short = Read-Host "Bitte Kürzel eingeben:"
}
'2' {
$short = Read-Host "Bitte Benutzernamen eingeben:"
$info = Read-Host -Prompt 'Bitte Beschreibung eingeben.'
}
'q' {
return
}
default {
# this will be executed if $input does not match another option.
# continue/break will apply to the switch block, not the do block
}
}
do
{
Write-Host "Loop done"
Clear-Variable -Name vorname,short,name,info
$response = Read-Host "Drücken Sie R zum Wieder holen, Q zum Beenden"
if($response -notin @("r","q")){
Continue
}
if ($response -eq "Q")
{
exit
}
}until ($response -eq "R")
}until ($input -eq 'q')