Start-Sleep приостанавливает всю функцию - PullRequest
0 голосов
/ 03 января 2019

У меня есть скрипт PowerShell с функцией извлечения информации LAPS, когда кто-то вводит имя компьютера.Я хотел бы очистить вывод через 60 секунд, чтобы кто-нибудь случайно не оставил пароль на своем экране.

Похоже, что независимо от того, где находится спящий режим в функции (или даже после)скрипт приостанавливается на 60 секунд, затем отображает информацию и никогда не очищается.

Часть скрипта, которая ожидает и очищает:

Start-Sleep -s 60
$WPFOutputbox.Clear()

(ищите мои #TRIED HERE комментарииниже)

function GETLAPS {
    Param ($computername = $WPFComputer.Text)

    try {
        $LAPSComputer = Get-AdmPwdPassword -ComputerName $computername |
                        Select-Object -ExpandProperty computername
        $LAPSDistinguished = Get-AdmPwdPassword -ComputerName $computername |
                             Select-Object -ExpandProperty distinguishedname
        $LAPSPassword = Get-AdmPwdPassword -ComputerName $computername |
                        Select-Object -ExpandProperty Password
        $LAPSExpire = Get-AdmPwdPassword -ComputerName $computername |
                      Select-Object -ExpandProperty Expirationtimestamp
    } catch {
        $ErrorMessage = $_.Exception.Message
    }
    if ($ErrorMessage -eq $null) {
        $WPFOutputBox.Foreground = "Blue"
        $WPFOutputBox.Text = "Local Admin Information for: $LAPSComputer

    Current: $LAPSPassword

    Exipiration: $LAPSExpire

    SCREEN WILL CLEAR AFTER 60 SECONDS"
        #TRIED HERE
    } else {
        $WPFOutputBox.Foreground = "Red"
        $WPFOutputBox.Text = $ErrorMessage
    }
    #TRIED HERE
}

Вместо этого сценарий будет ждать 60 секунд, чтобы показать информацию, и никогда не очищать экран.

Ответы [ 2 ]

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

Если вы не создадите отдельный поток, я настоятельно рекомендую не использовать Start-Sleep командлет в Windows Forms или Windows Presentation Foundation , поскольку это, очевидно, будетостановите интерфейс пользователя.

Вместо этого я бы рекомендовал использовать событие (Windows.Forms.Timer).

Для этого я написал небольшую функцию для задержки команды:

Команда задержки

Function Delay-Command([ScriptBlock]$Command, [Int]$Interval = 100, [String]$Id = "$Command") {
    If ($Timers -isnot "HashTable") {$Global:Timers = @{}}
    $Timer = $Timers[$Id]
    If (!$Timer) {
        $Timer = New-Object Windows.Forms.Timer
        $Timer.Add_Tick({$This.Stop()})
        $Timer.Add_Tick($Command)
        $Global:Timers[$Id] = $Timer
    }
    $Timer.Stop()
    $Timer.Interval = $Interval
    If ($Interval -gt 0) {$Timer.Start()}
}; Set-Alias Delay Delay-Command

Пример

Delay {$WpFOutputBox.Text = ''} 60000

Параметры

-Command
Командас задержкой.

-Interval
Время ожидания перед выполнением command.
Если -Interval установлено на 0 или меньше,command (с соответствующим Id) будет сброшено.
По умолчанию установлено значение 100 (незначительный промежуток времени, чтобы другие события могли начать).

-Id
Id отложенной команды.Несколько команд, которые могут выполнять различные Id одновременно.Если тот же Id используется для команды, которая еще не выполнена, интервальный таймер будет сброшен (или отменен, если установлено значение 0).
Значение по умолчанию Id в командной строке.

0 голосов
/ 04 января 2019

Вызовите функцию, поспите 60 секунд, затем очистите ее.Не засыпайте внутри функции, поместите ее там, где вы вызываете функцию.Что-то вроде:

$WPFGetLAPSButton.add_click({
    GETLAPS
    # If no error, wait 60 seconds and clear the text box
    If($WPFOutputBox.Foreground -eq "Blue"){
        Start-Sleep 60
        $WPFOutputBox.Text = ''
    }
})

Уверен, что это сделает то, что вы ищете.

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