菜单使用开关不接受我的输入,处于电源外壳中
本文关键字:于电源 电源 外壳 开关 不接受 输入 我的 菜单 | 更新日期: 2023-09-27 18:19:04
我有这个项目为学校,在那里我应该创建一个菜单的几个原因,我使用开关处理的选项,应该带我到一个新的开关,然后应该是一个新的子菜单。然而,由于某些原因,它只是让我放下我的开关,不管我做出什么选择,它只是跳到下一个开关。我的代码写在下面。我使用的程序是Power shell。
$Title = "Main Management"
$Message = "Welcome to the Management Menu"
$ChoiceOU = New-Object System.Management.Automation.Host.ChoiceDescription "&Create OU", `
"Add OU creation"
$ChoiceGroup = New-Object System.Management.Automation.Host.ChoiceDescription "&Group", `
"Group"
$ChoiceAddGroup = New-Object System.Management.Automation.Host.ChoiceDescription "&Create Group", `
"Add Group"
$ChoiceAddGroupCSV = New-Object System.Management.Automation.Host.ChoiceDescription "&Create Group from CSV", `
"Add Group from CSV"
$TitleGroup = "Group Management"
$MessageGroup = "Choose your group creation"
$ChoiceUser = New-Object System.Management.Automation.Host.ChoiceDescription "&User", `
"User"
$ChoiceAddUser = New-Object System.Management.Automation.Host.ChoiceDescription "&Create User", `
"Add User"
$ChoiceAddUserCSV = New-Object System.Management.Automation.Host.ChoiceDescription "&Create User from CSV", `
"Add User from CSV"
$TitleUser = "User Creation"
$MessageUser = "Creation form"
$UserList = New-Object System.Management.Automation.Host.ChoiceDescription "&Export Userlist", `
"Export Lists"
$DeleteUser = New-Object System.Management.Automation.Host.ChoiceDescription "&Delete User", `
"Delete User"
$EditUser = New-Object System.Management.Automation.Host.ChoiceDescription "&Edit User", `
"Edit User"
$MainOptions = [System.Management.Automation.Host.ChoiceDescription[]] ($ChoiceOU, $ChoiceGroup, $ChoiceUser, $UserList, $DeleteUser, $EditUser)
$MainMenu = $Host.UI.PromptForChoice($Title, $Message, $MainOptions, 0)
$SubGroupOptions = [System.Management.Automation.Host.ChoiceDescription[]] ($ChoiceAddGroup, $ChoiceAddGroupCSV)
$SubGroupMenu = $Host.UI.PromptForChoice($TitleGroup, $MessageGroup, $SubGroupOptions, 0)
$SubUserOptions = [System.Management.Automation.Host.ChoiceDescription[]] ($ChoiceAddUser, $ChoiceAddUserCSV)
$SubUserMenu = $Host.UI.PromptForChoice($TitleUser, $MessageUser, $SubUserOptions, 0)
$CreateGroupForm = New-Object System.Windows.Forms.Form
switch ($MainMenu)
{
0 {"You selected OU"}
1 {$SubGroupMenu}
2 {$SubUserMenu}
3 {"You selected User List"}
4 {"You selected Delete User"}
5 {"You selected Edit User"}
}
switch ($SubGroupMenu)
{
0 {$CreateGroupForm.showdialog()}
1 {"CSV Import"}
}
switch ($SubUserMenu)
{
0 {"User Creation"}
1 {"Choose CSV"}
}
您的代码只是通过每个开关运行,而不是由用户所做的选择引导,这似乎有两个原因。
第一个问题是,您没有任何逻辑来确定何时显示提示符。行:
$MainOptions = [System.Management.Automation.Host.ChoiceDescription[]] ($ChoiceOU, $ChoiceGroup, $ChoiceUser, $UserList, $DeleteUser, $EditUser)
$MainMenu = $Host.UI.PromptForChoice($Title, $Message, $MainOptions, 0)
$SubGroupOptions = [System.Management.Automation.Host.ChoiceDescription[]] ($ChoiceAddGroup, $ChoiceAddGroupCSV)
$SubGroupMenu = $Host.UI.PromptForChoice($TitleGroup, $MessageGroup, $SubGroupOptions, 0)
$SubUserOptions = [System.Management.Automation.Host.ChoiceDescription[]] ($ChoiceAddUser, $ChoiceAddUserCSV)
$SubUserMenu = $Host.UI.PromptForChoice($TitleUser, $MessageUser, $SubUserOptions, 0)
无论前面提示符提供的值是什么,写入的都将顺序执行。你可以这样做:
$MainOptions = [System.Management.Automation.Host.ChoiceDescription[]] ($ChoiceOU, $ChoiceGroup, $ChoiceUser, $UserList, $DeleteUser, $EditUser)
$MainMenu = $Host.UI.PromptForChoice($Title, $Message, $MainOptions, 0)
if($MainMenu -eq 1){
$SubGroupOptions = [System.Management.Automation.Host.ChoiceDescription[]] ($ChoiceAddGroup, $ChoiceAddGroupCSV)
$SubGroupMenu = $Host.UI.PromptForChoice($TitleGroup, $MessageGroup, $SubGroupOptions, 0)
}
if($MainMenu -eq 2){
$SubUserOptions = [System.Management.Automation.Host.ChoiceDescription[]] ($ChoiceAddUser, $ChoiceAddUserCSV)
$SubUserMenu = $Host.UI.PromptForChoice($TitleUser, $MessageUser, $SubUserOptions, 0)
}
这将导致只有当用户选择适当的选项时才显示其他提示。
下一个问题是,如果你在一个循环中运行这个脚本,允许多个顺序选择,$SubGroupMenu和$SubUserMenu的值将不会被覆盖。如果在迭代1中,您为组菜单选择了选项1,那么在迭代2中,变量$SubGroupMenu仍然保持值为'1',并将触发随后的切换情况(除非再次调用该特定提示并做出新的选择)。为了防止这种行为,您可以在主菜单提示符后执行以下操作:
if($MainMenu -eq 1){
$SubGroupOptions = [System.Management.Automation.Host.ChoiceDescription[]] ($ChoiceAddGroup, $ChoiceAddGroupCSV)
$SubGroupMenu = $Host.UI.PromptForChoice($TitleGroup, $MessageGroup, $SubGroupOptions, 0)
}
else{
$SubGroupMenu = $null
}
if($MainMenu -eq 2){
$SubUserOptions = [System.Management.Automation.Host.ChoiceDescription[]] ($ChoiceAddUser, $ChoiceAddUserCSV)
$SubUserMenu = $Host.UI.PromptForChoice($TitleUser, $MessageUser, $SubUserOptions, 0)
}
else{
$SubUserMenu = $null
}
请注意,这与上面添加条件的代码段相同,现在我只需添加else语句,将变量设置为$null。这里不能使用elseif,因为必须确保两个变量都被覆盖。
如果你想让整个脚本由开关驱动,那么你必须做一些事情,比如把子菜单提示放在主菜单开关的代码块中,像这样:
$MainOptions = [System.Management.Automation.Host.ChoiceDescription[]] ($ChoiceOU, $ChoiceGroup, $ChoiceUser, $UserList, $DeleteUser, $EditUser)
$MainMenu = $Host.UI.PromptForChoice($Title, $Message, $MainOptions, 0)
switch ($MainMenu)
{
0 {"You selected OU"}
1 {$SubGroupOptions = [System.Management.Automation.Host.ChoiceDescription[]] ($ChoiceAddGroup, $ChoiceAddGroupCSV)
$SubGroupMenu = $Host.UI.PromptForChoice($TitleGroup, $MessageGroup, $SubGroupOptions, 0)}
2 {$SubUserOptions = [System.Management.Automation.Host.ChoiceDescription[]] ($ChoiceAddUser, $ChoiceAddUserCSV)
$SubUserMenu = $Host.UI.PromptForChoice($TitleUser, $MessageUser, $SubUserOptions, 0)}
3 {"You selected User List"}
4 {"You selected Delete User"}
5 {"You selected Edit User"}
}
此解决方案将遇到上述关于多次迭代的相同问题。因此,您必须再次确保覆盖子菜单变量,并且不能将它们设置为默认的0,否则将对它们执行0情况。这可以在主菜单用例的case代码块中完成,除了正在写入的文本之外,还可以将这些变量设置为$null。这样的:
0 {"You selected OU"; $SubGroupMenu = $null; $SubUserMenu = $null}
请注意,虽然这个解决方案当然有效,但如果应用程序变得更复杂,您可能需要重新考虑您的控制逻辑,而不是试图将所有内容强制到这些情况下。