Эквивалент PowerShell Linux тайм-аут - PullRequest
1 голос
/ 14 января 2020

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

Вот наиболее близкий вариант, который я придумал (используя ping в качестве примера)

$x = Start-Process -Filepath "ping" -ArgumentList 'google.com -n 100' -NoNewWindow -PassThru; 
Start-Sleep -Seconds 5; 
try { Stop-Process -Id $x.Id -ErrorAction stop } catch {};

Это убьет процесс после достижения тайм-аута (если он все еще работает) и вернется к приглашению. Однако он не вернется к приглашению, если команда успешно завершится до истечения времени ожидания. Это приводит к тому, что сценарий всегда занимает столько времени, сколько указано в значении времени ожидания.

Желаемая семантика аналогична или идентична команде Linux s timeout .

Требования:

  • Если задача завершается в течение времени ожидания, управление возвращается к сценарию (отображается приглашение)
  • Если время ожидания истекло, и задача все еще выполняется, задача уничтожается, и управление возвращается к сценарию (отображается приглашение)
  • Вывод задания должен быть распечатан / отображен на стандартный вывод
  • Работает через соединение S SH

Ответы [ 2 ]

2 голосов
/ 14 января 2020

Отредактировано для использования пинга вместо блокнота. Я объединяю wait-process и "$?" в один оператор с помощью $ (), потому что powershell «if» смотрит на вывод, а не на выход.

start ping 'google.com -n 100'
if (-not $(wait-process ping 10; $?)) { 
  stop-process -name ping }
0 голосов
/ 14 января 2020

Я думаю, что некоторые требования могут быть выполнены с помощью секундомера, вам придется проверить соединение S SH.

$timeOut = New-TimeSpan -Seconds 5
$stopWatch = [System.Diagnostics.Stopwatch]::StartNew()

do {
    try { 
          Test-Connection -ComputerName google.ca -Count 1 -ErrorAction Stop
          $timeOut = New-TimeSpan -Seconds 0  #Stop the stopWatch, we got a response
    }
    catch { #Write-Host "No response" }
}
While ($stopWatch.elaspsed -lt $timeOut)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...