У меня есть меню, в котором я вызываю функции, используя цифры. Вызов выглядит примерно так:
<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. Как мне правильно организовать процесс?
Вам нужно создать функцию, которая будет ожидать нажатия клавиш и обрабатывать ввод, не требуя нажатия клавиши "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