Как создать отдельную функцию для обработки нажатий клавиш в PowerShell?

У меня есть меню, в котором я вызываю функции, используя цифры. Вызов выглядит примерно так: 
<pre><code>Write-Host "Press Enter to execute" -ForegroundColor Green
Write-Host "Or 0 to return" -ForegroundColor Green
$key = $Host.UI.RawUI.ReadKey("NoEcho,IncludeKeyDown")
if ($key.Character -eq "0") {
	Clear-Host
	break
} elseif ($key.Character -eq "`r") {
	Start-Sleep -Seconds 1
	Write-Host
	DriverI #Функция
	pause
	Clear-Host
	break
}</code></pre> 
Суть этого кода заключается в том, что перед выполнением функции выводится небольшое сообщение с инструкцией: "нажмите клавишу, чтобы выполнить, или 0 для возврата в главное меню". У меня много таких строк кода, где лишь функция меняется, и мне нужно выяснить, как создать отдельную функцию для этого процесса. 

П.с. Я уже пытался вынести строку `$key = $Host.UI.RawUI.ReadKey("NoEcho,IncludeKeyDown")`, но она постоянно ожидает пользовательский ввод. Я также создавал отдельную функцию, вот так: 
<pre><code>function Wait-ForUserInput {
	Write-Host "Press Enter to execute" -ForegroundColor Green
	Write-Host "Press 0 then enter to return" -ForegroundColor Green
    $inputKey = Read-Host

    if ($inputKey -eq "0") {
        break
    }
}</code></pre> 
Однако она мне не очень подошла, так как требует нажатия клавиши Enter после ввода 0. Как мне правильно организовать процесс?
  • 8 марта 2025 г. 11:35
Ответы на вопрос 3
Вам нужно создать функцию, которая будет ожидать нажатия клавиш и обрабатывать ввод, не требуя нажатия клавиши "Enter". Логика вашей функции должна сохранять часть, связанную с ожиданием ввода клавиш, и возвращать, какую клавишу нажал пользователь. 

Вот пример функции `Wait-ForUserInput`, которая ожидает нажатие клавиш и обрабатывает ваш ввод, а также пример того, как использовать эту функцию:

```powershell
function Wait-ForUserInput {
    param (
        [string]$message = "Press Enter to execute",
        [string]$returnMessage = "Press 0 to return"
    )

    Write-Host $message -ForegroundColor Green
    Write-Host $returnMessage -ForegroundColor Green

    $inputKey = $Host.UI.RawUI.ReadKey("NoEcho,IncludeKeyDown")

    if ($inputKey.Character -eq "0") {
        return "Return"  # Возвращает специальный флаг для обработки
    } elseif ($inputKey.Character -eq "`r") {
        return "Execute"  # Возвращает флаг для выполнения функции
    }

    return $null  # Возвращает null, если была нажата другая клавиша
}

# Пример использования
while ($true) {
    Clear-Host
    $choice = Wait-ForUserInput

    if ($choice -eq "Return") {
        break  # Выход из меню
    } elseif ($choice -eq "Execute") {
        Start-Sleep -Seconds 1
        Write-Host "Executing DriverI function..." 
        DriverI  # Вызов функции
        Pause
    }
}
```

### Объяснение кода:

1. **Функция `Wait-ForUserInput`**:
   - Принимает два параметра: сообщения для отображения пользователю.
   - Использует `RawUI.ReadKey` для получения нажатия клавиш без необходимости нажатия "Enter".
   - Возвращает строки "Return" или "Execute" в зависимости от нажатой клавиши, чтобы можно было обрабатывать ввод в главном цикле.

2. **Основной цикл**:
   - Вызывает функцию `Wait-ForUserInput` и сохраняет результат в переменную `$choice`.
   - Если возвращается "Return", цикл прерывается, что позволяет выйти в главное меню.
   - Если возвращается "Execute", выполняется заданная функция, например, `DriverI`.

Таким образом, ваша программа более структурирована, и процесс обработки клавиш вынесен в отдельную функцию, что уменьшает дублирование кода.
покумекал что-то придумал 
создаем функцию:
function Wait-ForUserInput {
    Write-Host "Press Enter to execute" -ForegroundColor Green
    Write-Host "Or 0 to return" -ForegroundColor Green
    
    $key = $Host.UI.RawUI.ReadKey("NoEcho,IncludeKeyDown")
    
    if ($key.Character -eq "0") {
        Clear-Host
        return  # Возвращение в меню
    } elseif ($key.Character -eq "`r") {
        Start-Sleep -Seconds 1
        Write-Host
        & $script  # Вызов функции
        Read-Host "Press Enter to continue"
        Clear-Host
        return
    }
}


а в меню будем писать:

$script = { DriverB }
Wait-ForUserInput
$script = $null

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