壹影博客.
我在下午4点钟开始想你
Powershell接收用户输入命令行控制用户单选
  • 2023-7-22日
  • 0评论
  • 13353围观

 

Powershell接收用户输入命令行控制用户单选

我们在进行Powershell开发时经常会遇到用户选择的场景,Powershell中接收用户输入用原始的Read-Host接收用户输入的话比较单一,也非常局限,那么能不能将这种功能做成可视化的单选呢?当然是可以的代码如下,仅供参考

function Show-Menu {
    param (
        [string[]]$Options
    )

    $selectedOptionIndex = 0

    while ($true) {
        # 显示菜单列表
        for ($i = 0; $i -lt $Options.Length; $i++) {
            $isSelected = $i -eq $selectedOptionIndex
            if($isSelected){
            # 显示绿色文字 以[*]开头
            Write-Host ("{0} {1}" -f '[*]', $Options[$i]) -ForegroundColor Green
            }else{
            Write-Host ("{0} {1}" -f '[ ]', $Options[$i])
            }   
        }

        # 监听用户输入
        $key = $host.UI.RawUI.ReadKey("NoEcho,IncludeKeyDown")
        
        # Process user input
        switch ($key.VirtualKeyCode) {
            38 {  
                # 按下 上键触发
                $selectedOptionIndex = [Math]::Max(0, $selectedOptionIndex - 1)
                # 将光标移动到屏幕顶部
                [Console]::SetCursorPosition(0, [Console]::CursorTop - $Options.Length)
            }
            40 {
                # 按下 下键触发
                # 将光标移动到屏幕顶部
                $selectedOptionIndex = [Math]::Min($Options.Length - 1, $selectedOptionIndex + 1)
                [Console]::SetCursorPosition(0, [Console]::CursorTop - $Options.Length)
            }
            13 {  # 按下 回车键触发
                return $Options[$selectedOptionIndex]
            }

            default{
              # 请勿删除-当用户点击其他按键的时候依然要进行显示偏移
              [Console]::SetCursorPosition(0, [Console]::CursorTop - $Options.Length)
            }
        }
    }
}

# 案例
Write-Host "You selected: $selectedOption"
$options = @("Option A", "Option B", "Option C")
$selectedOption = Show-Menu -Options $options

Write-Host $selectedOption

效果如下:

发表评论