Есть ли способ избежать разрыва строки при использовании Read-Host? - PullRequest
1 голос
/ 24 марта 2020

Я работаю над сценарием Powershell для наших ребят из службы поддержки, чтобы помочь им в их повседневных задачах. У меня есть некоторый опыт работы с Powershell, но он далеко не хардкорный программист.

Я считаю, что мой вопрос довольно прост c, хотя я пока не смог найти точного ответа.

function f_LOCAL_CheckADUser($strInitials)
{
    try
    {
        $TestVariable = Get-ADUser -Identity $strInitials -Properties *
        Write-Host " - approved" -ForegroundColor Green
    }
    catch
    {
        Write-Host " - does not exist" -ForegroundColor Red
    }
}

$Internal_Initials = Read-Host " Enter initials"; f_LOCAL_CheckADUser $Internal_Initials

Что происходит: пользователь вводит чьи-то инициалы (SamAccountName), затем запись проверяется по нашей AD, чтобы узнать, существует ли пользователь, это работает нормально, но «одобрить» / «не существует» строка печатается в строке под тем, что было введено пользователем.

Вот как это выглядит сейчас:

Present outcome

Мой вопрос Тогда есть ли способ избежать разрыва строки, и чтобы «подтвердить» / «не существует» было напечатано на той же строке, где пользователь вводил данные?

Хотелось бы, чтобы это было отображается так:

Desired outcome

Я искал повсюду и нашел вдохновение в том, как убрать строку и заменить ее на новый, но кажется, что все излишнее убийство. Поэтому я надеюсь, что простое решение может существовать.

Вдохновение: PowerShell - строка перезаписи, написанная с помощью Write-Host , передана Boluwade Kujero за публикацию ответа.

1 Ответ

0 голосов
/ 25 марта 2020

Начиная с PowerShell 5.1, теперь поддерживаются escape-последовательности виртуального терминала (VT). Одна форма escape-последовательности может перемещать позицию курсора, пока хост поддерживает это. Например:

$esc = [char]27
$setCursorTop = "$esc[0;0H"

function f_LOCAL_CheckADUser($strInitials)
{
    $setCursorRight = "$esc[0;$(18 + $strInitials.length)H"
    try
    {
        $TestVariable = Get-ADUser -Identity $strInitials -Properties *
        Write-Host "${setCursorRight} - approved" -ForegroundColor Green
    }
    catch
    {
        Write-Host "${setCursorRight} - does not exist" -ForegroundColor Red
    }
}

Clear-Host
$Internal_Initials = Read-Host "${setCursorTop} Enter initials"
f_LOCAL_CheckADUser $Internal_Initials

... может дать вам результаты, которые вы ищете.

Другие escape-последовательности могут быть более полезными, если вы хотите sh для сохранения информации на экране. , Для получения дополнительной информации о других поддерживаемых escape-последовательностях VT, посетите: https://docs.microsoft.com/en-us/windows/console/console-virtual-terminal-sequences

Надеюсь, это поможет.

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