Как обернуть этот командлет Powershell в функцию тайм-аута? - PullRequest
0 голосов
/ 11 мая 2019

Я пытался (и не смог) получить [System.Delegate] :: CreateDelegate (для работы, New-Object [System.Threading.Tasks.Task] :: Run (, для работы, Start-Job with Wait-Job, Powershell, похоже, не настроен на выполнение асинхронной задачи с тайм-аутом ожидания?

Если у кого-то есть какие-либо идеи, это было бы замечательно.

do 
{
    Sleep 2;
    $testShare = Test-Path "\\$server\c$";
    Write-Host "Share availability is:" $testShare;
}while($testShare -eq $true) # wait for the share to become unavailable

Предложение Адамса

do 
{
    Sleep 1;
    #$testShare = Test-Path "\\$server\c$"; # could use code here to deal with the hanging

    $timeout_in_seconds = 5;
    $timer = [Diagnostics.Stopwatch]::StartNew();
    do 
    {
        Write-Host "    Test-path inside of second do loop";
        Start-Sleep -Seconds 1;
        $testShare = Test-Path "\\$server\c$";
        Write-Host "    (Inner loop) Share availability is:" $testShare;
    } while ( (1 -eq 1) -and ($timer.Elapsed.TotalSeconds -lt $timeout_in_seconds) )
    $timer.Stop();
    $timer.Elapsed.TotalSeconds;

    Write-Host "";
    Write-Host "(Outer loop) Share availability is:" $testShare;
} while($testShare -eq $true) # wait for the share to become unavailable

Выход

    Test-path inside of second do loop
    (Inner loop) Share availability is: True
    Test-path inside of second do loop
    (Inner loop) Share availability is: True
    Test-path inside of second do loop
    (Inner loop) Share availability is: True
    Test-path inside of second do loop
    (Inner loop) Share availability is: True
    Test-path inside of second do loop
    (Inner loop) Share availability is: True
5.3015436

(Outer loop) Share availability is: True
    Test-path inside of second do loop
    (Inner loop) Share availability is: True
    Test-path inside of second do loop
    (Inner loop) Share availability is: True
    Test-path inside of second do loop
    (Inner loop) Share availability is: True
    Test-path inside of second do loop
    (Inner loop) Share availability is: True
    Test-path inside of second do loop
    (Inner loop) Share availability is: True
5.2303907

(Outer loop) Share availability is: True
    Test-path inside of second do loop
    (Inner loop) Share availability is: True
    Test-path inside of second do loop
    (Inner loop) Share availability is: False
**42.1773323**

(Outer loop) Share availability is: False
Ping availability is: False

1 Ответ

2 голосов
/ 11 мая 2019

Пара вещей ...

Наличие тайм-аута не требует асинхронной обработки.У вас может быть процесс синхронизации (как в вашем примере), который имеет тайм-аут.

Простой скрипт синхронизации с тайм-аутом ...

$timeout_in_seconds = 10
$timer = [Diagnostics.Stopwatch]::StartNew()

do {
    Start-Sleep -Seconds 1
    Write-Host 'Doing stuff'

} while ( (1 -eq 1) -and ($timer.Elapsed.TotalSeconds -lt $timeout_in_seconds) )

$timer.Stop()
$timer.Elapsed.TotalSeconds

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

Для вашего конкретного примера рассмотрим что-то вроде ...

$server = '...'
$timeout_in_seconds = 5;
$timer = [Diagnostics.Stopwatch]::StartNew();

do {
    Write-Host "Test-path inside of loop";
    Start-Sleep -Seconds 1;
    $testShare = Test-Path "\\$server\c$";
    Write-Host "Share availability is:" $testShare;
} while ( $($testShare) -and ($timer.Elapsed.TotalSeconds -lt $timeout_in_seconds) )

$timer.Stop();
$timer.Elapsed.TotalSeconds;

Цикл завершается, когда существует общий ресурс или достигнут временной интервал.Обратите внимание, вам нужно установить переменную $server.

...