菜单使用开关不接受我的输入,处于电源外壳中

本文关键字:于电源 电源 外壳 开关 不接受 输入 我的 菜单 | 更新日期: 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}

请注意,虽然这个解决方案当然有效,但如果应用程序变得更复杂,您可能需要重新考虑您的控制逻辑,而不是试图将所有内容强制到这些情况下。