Тайм-аут командлета Get-WMIObject - PullRequest
3 голосов
/ 15 марта 2012

Я запускаю скрипт, который выполняет много WMI-запросов - но командлет зависает, если сервер не отвечает .. Можно ли каким-то образом сделать этот (или любой другой командлет) тайм-аут и выйти, если прошло X секунд?

Редактировать

Благодаря подсказке от mjolinor, решение состоит в том, чтобы запустить это как -asjob и установить время ожидания в цикле while Но это уже выполняется из задания (началось с Start-Job). Так откуда мне знать, что я контролирую правильную работу?

Это мой код изнутри моей уже запущенной работы:

Get-WmiObject Win32_Service -ComputerName $server -AsJob

$Complete = Get-date

While (Get-Job -State Running){
    If ($(New-TimeSpan $Complete $(Get-Date)).totalseconds -ge 5) {
        echo "five seconds has passed, removing"
        Get-Job  | Remove-Job -Force
    }
    echo "still running"
    Start-Sleep -Seconds 3
}

PS: Моя работа, начатая с Start-Jobs, уже решена ..

Ответы [ 6 ]

2 голосов
/ 24 февраля 2013

Рад, что моя функция Get-WmiCustom здесь http://blogs.msdn.com/b/dmuscett/archive/2009/05/27/get_2d00_wmicustom.aspx полезна.

2 голосов
/ 22 декабря 2012

Вы можете попробовать функцию get-wmiCustom, опубликованную здесь . Разве не было бы хорошо, если бы get-wmiObject имел параметр timeout? Давайте поднимем эту вещь .

2 голосов
/ 15 марта 2012

Единственные два решения, которые я видел для этой проблемы:

  1. Запустите запросы как фоновые задания и установите для них таймер, затем остановите / удалите задания, которые тоже выполняютсяlong.

  2. Исправьте ваши серверы.

1 голос
/ 15 марта 2012

В дополнение к тому, что было сказано, не является пуленепробиваемым решением, но сначала рассмотрите возможность проверки связи с вашими серверами (Test-Connection), это может ускорить время выполнения, если у вас нет отвечающих машин.

0 голосов
/ 15 октября 2014

Я изменил Get-WmiCustom Даниэля Мусетты, чтобы также поддерживать передачу учетных данных.

Я знаю, что этот пост немного стар, надеюсь, это поможет кому-то еще.

# Define modified custom get-wmiobject for timeout with credential from http://blogs.msdn.com/b/dmuscett/archive/2009/05/27/get_2d00_wmicustom.aspx
Function Get-WmiCustom([string]$Class,[string]$ComputerName,[string]$Namespace = "root\cimv2",[int]$Timeout=15, [pscredential]$Credential) 
{ 
    $ConnectionOptions = new-object System.Management.ConnectionOptions
    $EnumerationOptions = new-object System.Management.EnumerationOptions

    if($Credential){
        $ConnectionOptions.Username = $Credential.UserName;
        $ConnectionOptions.SecurePassword = $Credential.Password;
    }


    $timeoutseconds = new-timespan -seconds $timeout 
    $EnumerationOptions.set_timeout($timeoutseconds)

    $assembledpath = "\\$Computername\$Namespace"
    #write-host $assembledpath -foregroundcolor yellow

    $Scope = new-object System.Management.ManagementScope $assembledpath, $ConnectionOptions 
    $Scope.Connect()

    $querystring = "SELECT * FROM " + $class 
    #write-host $querystring

    $query = new-object System.Management.ObjectQuery $querystring 
    $searcher = new-object System.Management.ManagementObjectSearcher 
    $searcher.set_options($EnumerationOptions) 
    $searcher.Query = $querystring 
    $searcher.Scope = $Scope

    trap { $_ } $result = $searcher.get()

    return $result 
}
0 голосов
/ 19 апреля 2013

при создании задания с использованием get-wmiobject назначьте это задание переменной, затем эта переменная может быть передана в get-job для статуса или receive-job для результатов

$ThisJob = start-job -scriptblock {param ($Target) Get-WmiObject -Class Win32_Service -ComputerName $Target -AsJob} -ArgumentList $server
$Timer = [System.Diagnostics.Stopwatch]::StartNew()
While ($ThisJob | Get-Job | where {$_.State -imatch "Running"}){
    If ($Timer.Elapsed.Seconds -ge 5) {
        echo "five seconds has passed, removing"
        $ThisJob | Get-Job | Remove-Job -Force
        } # end if
    echo "still running"
    Start-Sleep -Seconds 3
    } # end while

$Results = $ThisJob | where {$_.State -inotmatch "failed"} | receive-job
$Timer.Stop | out-null
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...