Scott

一个简单的命令行工具 4 months ago

go
2481个字符
共有27人围观

博客大纲

package main

import (
	"fmt"
	"os"
	"os/exec"

	"github.com/eiannone/keyboard"
)

type Task struct {
	Name        string
	Description string
	Command     string
}

// ANSI 颜色代码
const (
	Reset   = "\033[0m"
	Red     = "\033[31m"
	Green   = "\033[32m"
	Yellow  = "\033[33m"
	Blue    = "\033[34m"
	Magenta = "\033[35m"
	Cyan    = "\033[36m"
	White   = "\033[37m"
	// 高亮背景
	HighlightBg = "\033[43m" // 黄色背景
)

func main() {
	// 定义任务列表
	tasks := []Task{
		{Name: "清理缓存", Description: "清理系统临时文件", Command: "echo 清理缓存"},
		{Name: "检查更新", Description: "检查系统更新", Command: "echo 检查更新"},
		{Name: "重启服务", Description: "重启核心服务", Command: "echo 重启服务"},
		{Name: "退出", Description: "退出程序", Command: "exit"},
	}

	selected := 0
	running := true

	// 初始化键盘监听
	if err := keyboard.Open(); err != nil {
		fmt.Println("键盘初始化失败:", err)
		return
	}
	defer keyboard.Close()

	for running {
		// 清屏
		cmd := exec.Command("clear") // Windows 系统可以用 "cls"
		cmd.Stdout = os.Stdout
		cmd.Run()

		// 显示菜单
		fmt.Printf("%s使用上下键选择任务,回车执行:%s\n\n", Cyan, Reset)
		for i, task := range tasks {
			if i == selected {
				// 选中的任务使用黄色背景和白色文字
				fmt.Printf("%s%s> [%d] %s - %s%s\n",
					HighlightBg, White, i+1, task.Name, task.Description, Reset)
			} else {
				// 未选中的任务使用绿色文字
				fmt.Printf("%s  [%d] %s - %s%s\n",
					Green, i+1, task.Name, task.Description, Reset)
			}
		}

		// 获取键盘输入
		char, key, err := keyboard.GetKey()
		if err != nil {
			fmt.Println("键盘输入错误:", err)
			return
		}

		// 处理键盘输入
		switch {
		case key == keyboard.KeyArrowUp && selected > 0:
			selected--
		case key == keyboard.KeyArrowDown && selected < len(tasks)-1:
			selected++
		case key == keyboard.KeyEnter:
			executeTask(tasks[selected])
			if tasks[selected].Command == "exit" {
				running = false
			}
		case char == 'q' || key == keyboard.KeyEsc:
			running = false
		}
	}
}

func executeTask(task Task) {
	// 清屏
	cmd := exec.Command("clear")
	cmd.Stdout = os.Stdout
	cmd.Run()

	fmt.Printf("%s\n执行任务: %s%s\n", Yellow, task.Name, Reset)

	if task.Command != "exit" {
		// 执行系统命令
		cmd := exec.Command("bash", "-c", task.Command)
		cmd.Stdout = os.Stdout
		cmd.Stderr = os.Stderr
		err := cmd.Run()
		if err != nil {
			fmt.Printf("%s执行失败: %v%s\n", Red, err, Reset)
		}

		// 等待用户按任意键继续
		fmt.Printf("%s\n按任意键继续...%s", Cyan, Reset)
		keyboard.GetKey()
	}
}

显示效果:

使用上下键选择任务,回车执行:(青色)

> [1] 清理缓存 - 清理系统临时文件 (黄色背景+白色文字)
  [2] 检查更新 - 检查系统更新 (绿色文字)
  [3] 重启服务 - 重启核心服务 (绿色文字)
  [4] 退出 - 退出程序 (绿色文字)