﻿
 Принцип создания всех меню для AutoSetingsPS.

 Принцип простой, по сути надо только знать как указать цвет, текст, команду (Функцию или Командлет) для выполнения,
 и меню для перехода или выход. Реализованные возможности позволяют создать меню любой сложности и информативности.
 Далее в тексте слово функция подразумевает и возможность использования Командлета.


 1. Кодировка всех файлов должна быть UTF-8 с BOM.


 2. $Menu - Это переменная, объект, хэш-таблица [hashtable].
    Состав меню подчиняется правилам построения Хэш-таблиц, подробно: https://technet.microsoft.com/ru-ru/library/hh847780.aspx
    Чтобы контролировать корректность структуры, при работе с хэш-таблицами, нужно делать это в PowerShell ISE!
    Для удобства чтения и написания кода добавил свою тёмную тему для ISE: DarkTheme-for-PS-ISE.StorableColorTheme.ps1xml


 3. Меню для удобства разделено на разделы.
    Первые 3 информационные, необязательные: Info,  Status, Options
    Можно всю информацию оформить и в одном из этих трех, а другие вообще не включать в меню.

    Selection - важный необходимый раздел, на его основе определяется что выполнить, после выбора пользователя.

    У (Info,  Status, Options) названия у строк "цифры" можно и "буквы" только для соблюдения порядка при выводе на экран.
    У Selection названия у строк "цифры" можно и "буквы" проверяются на совпадение с выбором пользователя, порядок не важен.


 4. Разделы.

    Info      - Заголовок меню, будет отображен первым. Можно оформить важную информацию о текущем меню.
    Status    - Можно использовать для вывода текущего состояния параметров, не обязателен.
    Options   - Используется для отображения возможных вариантов для выбора.

    Selection - Невидимый раздел, по названиям строк определяется совпадение с вводом пользователя,
                для обработки строки в этом выборе.


 5. Значения всех строк.

    Все значения - сами строки, должны быть заглючены в одинарные кавычки, так как функции и меню должны быть строками!
    Двойные кавычки возможны в строках, которых нет функций или меню, если нужно вставить переменную,
    можно и везде использовать двойные кавычки, но надо понимать суть.
    Строки Могут быть массивом строк, то есть состоять из нескольких строк через запятую: 'Строка1', 'Строка2', 'и т.д.'

    В строках для первых трех разделов, для отображения, может быть указан просто текст; или команда (функциях или командлетах) для выполнения,
    чтобы подставить в строку результат ее выполнения. Можно в функциях делать вывод в нужном виде сразу.

    В строках для Selection может быть просто текст для вывода на экран перед или после выполнения указанной команды,
    или перехода в другое меню. Если текст в первой строке массива, то будет показан перед выполнением команды.
    Если команда, то будет выполнена.
    Или меню для перехода в него. Простой текст описания перед выполнением можно и не указывать.


 6. Примеры указания текста, цвета и функций в информационных разделах.
    (для раздела Selection цвет указывать нельзя, только текст, меню, функции, командлеты, и текст Exit, указывает выйти вообще).

    Имя команды указывается после символа '&': '& FuncName' или '& CommandletName'
    Если нужно передать коамнде параметры:
      '& FuncName | Param1, Param2, и т.д.'
      или '& CommandletName | -Test Param1 -Test2 Param1,Param2 и т.д.'

    Можно указать цвет для вывода (кроме Selection): '#Green# & FuncName'
    Можно перед функцией указать текст и цвет: '#Yellow#Текст #Green# & FuncName'
    Если добавлять после функции, нужен новый сегмент строки:
      'Первая функция: & FuncName1', 'Вторая функция: & FuncName2'

    После указания команды, в этом сегменте строки могут быть только параметры для этой команды!

    Общий смысл указания команды: '& Имя команды | тут любые параметры, которые нужны для нее',
    такая запись нужна для возможности понимания как нужно обрабатывать строку для вывода,
    а символы '&' и '|' нужны только для разделения на части и понимания нужного действия, они не играют тут роль самого выполнения.

    Для информационных разделов можно указывать цвет для всего и самих функций.
    Параметры цвета можно добавлять и в самом выводе функции, тогда в меню добавлять параметры цвета не надо.


 7. Для раздела Selection параметры цвета указывать нельзя.
    Добавлять всё отдельными сегментами: 'Просто текст для вывода',
    'функция для выполнения', 'Меню для перехода', команда Выход: 'Exit'

    Пример для выполнения функции: 1 = 'Выполнение функции FuncName: ', '& FuncName'
    Пример для выполнения 2 функций: 2 = 'Выполнение функции FuncName1 и FuncName2: ', '& FuncName1', '& FuncName2 | -Test Param'
    Пример для перехода в другое меню, текст не обязятелен, меню указывается с символом '$': 3 = 'Переход в меню 2', '$Menu2'
    Пример для закрытия скрипта: 'Exit' = 'Выход', 'Exit'

    Если функция или меню не будет существовать, ее имя выведеться как текст,
    с описанием, что такой функции или меню не существует.

    В функциях задаются действия, которые необходимо выполнить.
    Как указывать цвет, подробно изложил внутри файла функции для вывода цвета Write-HostColor: \Scripts-Main\Write-HostColor.ps1

    Пункт [Без ввода] соответствует пункту 'Exit' в Selection. То же самое если руками ввести Exit, Вместо выбора или без выбора.
    А если в значении у любого пункта присутствует 'Exit', то будет выход из скрипта.


Пример простого меню:

$Menu1 = @{

    Info =  @{

        0 = ''
        1 = ' =============================== '
        2 = '       Пример меню $Menu1'
        3 = ' =============================== '
        4 = ''
    }

    Options = @{

        1 = '[55] = Выполнить одно действие:   вывести язык системы'      # и сделать задержку в 2 сек, через  стандартный командлет, перед возвратом в меню
        2 = '[66] = Выполнить другое действие: вывести версию системы'
        3 = ''
        4 = '[Без ввода] = Выход'
        5 = ''
    }

    Selection = @{

       55 = '& Get-LangOS', '& Start-Sleep | -Milliseconds 2000'
       66 = '& Get-VersOS'
   'Exit' = 'Выход', 'Exit'

    }
}





Пример меню со всеми возможными вариантами, только для понимания сути:

$Menu2 = @{

    Info =  @{

        0 = ''
        1 = '#DarkGray# =============================================== #'
        2 = '    #Green#Пример меню,  Отобразить результат функции Get-ArhOS тут: #Green# & Get-ArhOS'
        3 = "    Текущий пользователь: #Green#$env:USERNAME"
        4 = '#DarkGray# =============================================== #'
        5 = ''
    }

    Status = @{

        0 = '      Ваша Windows: #Green# & Get-ArhOS ', '#DarkGray# | #:Green# & Get-LangOS'
        1 = ''
        2 = '      В данный момент:'
        3 = '      ФункРаз: &VersA', ' ФункДва: & VersB | -Test Param1, Param2'
        4 = '      ФункТри: & VersC'
        5 = ''
    }

    Options = @{

        0 = '#Cyan#  [0]# = Переход в меню 2#', ' #Cyan#[4]# = Выполнить функцию Func22 (А отобразить результат функции VersBM тут): #Red# & VersBM'
        1 = '#Cyan#  [1]# = #Yellow#Выполнить фукнцию Get-LangOS#    '
        2 = '#Cyan#[999]# = Переход в меню 3'
        3 = '#Cyan#  [3]# = Выполнение функции VersBM 2 раза с разными параметрами без вывода предварительно текста.'
        4 = '#Cyan#  [G]# = Выполнение функции Func5 c 2 параметрами'
        5 = ''
        6 = '#Cyan#[Без ввода]# = Возврат в главное меню'
        7 = ''
    }

    Selection = @{

      999 = 'Переход в меню 3', '$Menu3'
        0 = 'Переход в меню 2', '$Menu2'
        1 = 'Выполнение фукнции Get-LangOS', '& Get-LangOS'
        3 = '& VersBM | Param1', '&VersBM | Param2'
        4 = 'Выполнить функцию Func22', '& Func22'
        G = 'Выполнение функции Func5', '& Func5 | Param1 Param2'
   'Exit' = 'Возврат в главное меню', '$MainMenu'

    }
}