'Create show-menu in powershell depending on variables
I want to create a menu with show-menu that will depend on what is present on the computer.
I want to list in the menu usernames available on c:\users\ (based on the folders names).
For example : in c:\users there is folder nammed :
homer.simpson
lisa.simpson
bart.simpson
and with show-menu ask the user to choose one of them by typing 1 for homer.simpson 2 for lisa.simpson etc ..
How can i do it ?
Thank you in advance !
EDIT : Code
$users = Get-ChildItem "$env:SystemDrive\Users"| ForEach-Object { $_.Name }
foreach ($user in $user) {
$user
$num++
New-Variable -Name "a$num" -Value $user
#Get-Variable -Name "$user$i"
}
function Show-Menu
{
param (
[string]$Title = 'Please select an user'
)
cls
Write-Host "================ $Title ================"
Write-Host "1: $a1"
Write-Host "2: $a2"
Write-Host "3: $a3"
Write-Host "Q: $a4"
}
do
{
Show-Menu
$input = Read-Host "Please make a selection"
switch ($input)
{
'1' {
cls
'You chose option #1'
} '2' {
cls
'You chose option #2'
} '3' {
cls
'You chose option #3'
} 'q' {
return
}
}
pause
}
until ($input -eq 'q')
Solution 1:[1]
Try this (based on Show-Menu by Adam Bertram):
function Show-Menu
{
param (
[string]$Title = 'My Menu'
)
Clear-Host
Write-Host "================ $Title ================"
$Menu = @{}
(Get-ChildItem C:\Users).Name | ForEach-Object -Begin {$i = 1} {
Write-Host "$_`: Press '$i' for this option."
$Menu.add("$i",$_)
$i++
}
Write-Host "Q: Press 'Q' to quit."
$Selection = Read-Host "Please make a selection"
if ($Selection -eq 'Q') { Return } Else { $Menu.$Selection }
}
$UserSelection = Show-Menu -Title 'Local Users'
Per the comments, uses (Get-ChildItem C:\Users).Name
to get the list of user folder names. These are then piped to a ForEach-Object
loop which starts by initilizing a counter variable $i
as 1.
In the loop it prints out the name of each file (now represented as $_
which is the automatic variable for the current item in the pipeline) and uses the counter variable to display the numbered options. It also puts each number/name pair in a hashtable named $Menu
which is then used as a lookup when the selection is entered via Read-Host
.
The selected option is returned to the $UserSelection
variable.
Solution 2:[2]
AHA! I figured it out! :)
function Show-Menu
{
param (
[string]$Title = 'My Menu'
)
Clear-Host
Write-Host "================ $Title ================"
$Menu = @{}
(Get-ChildItem C:\Users).Name | ForEach-Object -Begin {$i = 1} {
Write-Host "$_`: Press '$i' for this option."
$Menu.add("$i",$_)
$i++
}
Write-Host "Q: Press 'Q' to quit."
$Selection = Read-Host "Please make a selection"
if ($Selection -eq 'Q') { Return } Else { $Menu.$Selection }
}
#$UserSelection = Show-Menu -Title 'Local Users'
#(Get-ChildItem C:\Users).Name
$userinput = Show-Menu -Title 'Local Users'
(Get-ChildItem C:\users\$userinput\ntuser.dat -Force | select @{e={(Split-path $_.Directory -Leaf)}},last* | sort lastwritetime -Descending)
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
Solution | Source |
---|---|
Solution 1 | |
Solution 2 | Patrick Burwell |