I have created another Powershell module. This time it is about Console Menus you can use to ease the usage for members of your oranization. It is available on

and published to the

. It is called cliMenu.





















Puppies





This is a Controller module. It uses Write-Host to create a Menu in the console. Some of you may recall that using Write-Host is bad practice. Controller scripts and modules are the exception to this rule. In addition with WMF5 Write-Host writes to the Information stream in Powershell, so it really does not matter anymore.









Design goal





I have seen to many crappy menus that is a mixture of controller script and business logic. It is in essence a wild west out there, hence my ultimate goal is to create something that makes it as easy as possible to create a menu and change the way it looks.

Make it easy to build Menus and change them Make it as "declarative" as possible





Menus





The module supports multiple Menus, however only one Main-Menu with as many Sub-Menus as you like. Each menu has a collection of Menu-Items that the user can choose from.





Example menu:









Menu options





Currently you can control the following aspects of the menu (they are shared across all menus unless you change them before showing a sub-menu):



Choose the char that creates the outer frame of the menu

Change the color of the frame

Change the color and DisplayName for the Menus

Change the color and Heading for the Menus

Change the color and Sub-Heading for the Menus

Change the color and DisplayName for the Menu-Items

Change the color and footer text for the menus

Change the Width of the Menu

Menu-Items





Menu-Items are the elements your users can invoke in your Menu. They have a ScriptBlock and a DisableConfirm switch parameter in addition to a Name and DisplayName. With the

DisableConfirm parameter,

you may selectively force the user to confirm the action before it is invoked.









Validation and Return value





The goal of this module is neither. As a tool-builder you are responsible for validating user input when they invoke the ScriptBlock associated with the Menu-Item.





Any output from the ScriptBlock will be written in the console. As you may know, a ScriptBlock may be a small script or a call to a cmdlet with parameters. I would suggest that you stick to calling custom or built-in cmdlets and design it using the best practice guides from Microsoft in regards to mandatory parameters etc.









Show-Menu





This is the core cmdlet responsible for building the Menu and displaying it to the user. Executed without parameters it will display the Main-Menu (remember you can only have one Main-Menu). Nevertheless you may also use it to display Sub-Menus by specifying the parameter MenuId which is the index of the menu.





Further you may also invoke a specific Menu-Item in a specific Menu by supplying InvokeItem and MenuId parameters. If the Menu-Item is defined to confirm with the user before invocation, it will prompt the user with a confirmation request before execution. You can override this with the -Force parameter to execute it directly.









Examples





A menu which uses the Show-Command cmdlet (complete script in example.ps1 ):









An example with a Main-Menu and Sub-Menu:











Big thank you to Fausto Nascimento for invaluable input and suggestions!





That is it. If you have any questions or issues, look me up on twitter (@toreGroneng) or file an issue on GitHub.





Cheers





Tore