Как я могу избежать чтения хоста, нажав escape? - PullRequest
1 голос
/ 05 апреля 2019

просто интересует, возможно ли выйти из узла чтения в цикле while, нажав escape.

Я попытался выполнить цикл do-else, но он распознает только нажатия кнопок вне узла чтения.

Это в основном то, что у меня есть

#Import Active Directory Module
Import-Module ActiveDirectory

#Get standard variables
$_Date=Get-Date -Format "MM/dd/yyyy"
$_Server=Read-Host "Enter the domain you want to search"

#Request credentials
$_Creds=Get-Credential

while($true){

    #Requests user input username
    $_Name=Read-Host "Enter account name you wish to disable"

    #rest of code
    }

Я хочу быть в состоянии избежать его, если я хочу изменить домен

Ответы [ 2 ]

1 голос
/ 05 апреля 2019

Используя Read-Host, вы не можете сделать это, но вы можете рассмотреть возможность использования графического диалогового окна ввода вместо запроса в консоли. В конце концов, командлет Get-Credential также отображает графический интерфейс.

Если это вариант для вас, это можно сделать, используя что-то вроде этого:

function Show-InputBox {
    [CmdletBinding()]
    Param (
        [Parameter(Mandatory = $true, Position = 0)]
        [string]$Message, 

        [string]$Title = [System.IO.Path]::GetFileNameWithoutExtension($MyInvocation.PSCommandPath),

        [string]$defaultText = ''
    )
    Add-Type -AssemblyName 'Microsoft.VisualBasic'
    return [Microsoft.VisualBasic.Interaction]::InputBox($Message, $Title, $defaultText)
}

while($true) {
    $_Name = Show-InputBox "Enter account name you wish to disable"
    if ([string]::IsNullOrWhiteSpace($_Name)) {
        # the box was cancelled, so exit the loop
        break
    }
    # proceed with the rest of the code
}

Если пользователь нажимает клавишу Esc , нажимает Отмена или оставляет ввод пустым, вы можете выйти из цикла while, в противном случае перейдите к коду.

0 голосов
/ 05 апреля 2019

Вы не можете сделать это с Read-Host, но вы можете сделать это с помощью PSReadLine модуля (поставляется с Windows PowerShell версии 5 или выше в Windows 10 / Windows Server 2016) и PowerShell Core) и его PSConsoleHostReadline функция:

Важно:

  • Начиная с PSReadLine v2.0.0-beta3, решение ниже представляет собой hack , поскольку PSConsoleHostReadline поддерживает запрос только для операторов PowerShell , не открытый ввод пользователя.

    • В этом предложении GitHub запрашивается возможность использования этой функции для пользовательского ввода общего назначения, что позволит в значительной степени настраивать взаимодействие с конечным пользователем. Сделайте так, чтобы ваш голос был услышан там, если вы хотите, чтобы это предложение было реализовано.
  • Хак должен работать в вашем случае, поскольку запрашиваемые имена пользователей должны быть синтаксически допустимыми операторами PowerShell.

    • Однако поддержка произвольного ввода проблематична по двум причинам:

      • Будет применена не применимая синтаксическая раскраска - однако вы можете временно установить для всех настраиваемых цветов один и тот же цвет, но это будет громоздко.

      • Что еще более важно, если входные данные являются чем-то, что составляет синтаксически неполный оператор PowerShell, PSConsoleHostReadline не примет ввод и вместо этого продолжит запрашивать (в новой строке ); например, ввод a| может вызвать эту проблему.

  • Также:

    • Какой бы ввод ни был введен, он всегда добавляется в историю команд .

    • В то время как вы можете удалить временно установленный обработчик клавиатуры при выходе из скрипта, нет надежного способа восстановить ранее активный - см. это Выпуск GitHub .

 # Set up a key handler that cancels the prompt on pressing ESC (as Ctrl-C would).
 Set-PSReadLineKeyHandler -Key Escape -Function CancelLine

 try {

   # Prompt the user:
   Write-Host -NoNewline 'Enter account name you wish to disable: '
   $_Name = PSConsoleHostReadLine

   # If ESC was pressed, $_Name will contain the empty string.
   # Note that you won't be able to distinguish that from the user
   # just pressing ENTER.
   $canceled = $_Name -eq ''

   # ... act on potential cancellation 

 } finally {

   # Remove the custom Escape key handler.
   Remove-PSReadlineKeyHandler -Key Escape

 }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...