Скрипт медленной обработки в Powershell, первые шаги рабочего процесса

Цель IDisposable - разрешить объекту фиксировать состояние любых внешних объектов, которые в своей выгоде были помещены в состояние, которое является менее идеальным для других целей. Например, объект Io.Ports.SerialPort, возможно, изменил состояние последовательного порта с «доступным для любого приложения, которое хочет, чтобы оно было« доступно только одному объекту Io.Ports.SerialPort »; основная цель SerialPort.Dispose - восстановить состояние последовательного порта «доступно для любого приложения».

Конечно, как только объект, реализующий IDisposable, сбросил объекты, которые поддерживали определенное состояние для его выгоды, он больше не будет иметь преимущества от состояния, поддерживаемого этими субъектами. Например, если состояние последовательного порта установлено в «доступно для любого приложения», потоки данных, с которыми он был связан, больше не могут использоваться для отправки и приема данных. Если бы объект мог нормально функционировать, если внешние сущности не были помещены в особое состояние для своей выгоды, не было бы причин оставлять внешние объекты в специальном состоянии в первую очередь.

Как правило, после IDisposable.Dispose был вызван на объект, нельзя ожидать, что объект способен много сделать. Попытка использовать большинство методов для такого объекта указывает на ошибку; если метод не может разумно ожидать, что он будет работать, правильный способ указать это через ObjectDisposedException.

Microsoft предполагает, что почти все методы объекта, который реализует IDisposable, должны бросать ObjectDisposedException, если они используются на объект, который был удален. Я бы предположил, что такой совет слишком широк. Часто бывает полезно использовать устройства для выявления методов или свойств, чтобы узнать, что произошло во время жизни объекта. Хотя можно было бы дать классу связи метод Close, а также метод Dispose, и позволить только запрашивать такие вещи, как NumberOfPacketsExchanged, после закрытия, но не после Dispose, но это кажется чрезмерно сложным. Чтение свойств, связанных с вещами, которые произошли до того, как объект был удален, выглядит вполне разумным.

0
задан Kevin 18 March 2019 в 15:44
поделиться

2 ответа

Я сам использовал Workflow, чтобы решить эту проблему. Несколько лет назад я это сделал, так что что-то лучше и новее. Но это прекрасно работает для меня ... За несколько минут я пингую более 2000 компьютеров ...

workflow Test-ComputersConnection
{
Param
(
    # Param1 help description
    $Computernames#,

    # Param2 help description
    #        [int]
    #        $Param2
)

foreach -parallel ($ComputerName in $Computernames)
{
    $ConnectionTest = Test-Connection -ComputerName $ComputerName -ErrorAction SilentlyContinue -Count 1

    if ($ConnectionTest.Address -eq $ComputerName) {
        Write-Output $(Add-Member -MemberType NoteProperty -Name "Computername" -Value $ComputerName -InputObject $ConnectionTest -PassThru )
        #Write-Verbose -Verbose -Message "[$($ComputerName)]: Replays on Ping."
    }
    Else {
        #Write-Verbose -Verbose -Message "[$($ComputerName)]: Do not replays on Ping."
    }
}
}

$OnlineNow0 = Test-ComputersConnection -Computernames $( Import-Csv -Path D:\ipcheck3.csv -UseCulture |
Select-Object -ExpandProperty name)

Приведенный выше код является быстрым редактированием того, что я использую ... Сначала вам нужно будет отредактировать оператор $ (Import ...), чтобы убедиться, что имя ПК передается в рабочий процесс. [ 112]

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

0
ответ дан Daniel Lindegaard 18 March 2019 в 15:44
поделиться

Я думаю, что ваше время процесса испорчено тайм-аутами. Если все ваши IP-адреса находятся в локальной сети, попробуйте сократить время ожидания (поскольку значение по умолчанию составляет 5 секунд).

Если у вас есть Powershell 6 :

Test-Connection $y -Count 1 -quiet -TimeoutSeconds 1

Если нет, просто используйте пинг :

ping 58.47.45.1 /w 1 /n 1

You Можно также использовать параллель для каждого цикла, но это не сильно поможет, если у вас есть несколько ошибок:

ForEach -Parallel ($x in $y)
{
    ...
}

ОБНОВЛЕНИЕ

Для обработки [114 ] результаты, вы можете использовать такую ​​функцию (я использовал ключевое слово «perte», потому что мой компьютер на французском языке):

Function Custom-Ping {
    Param(
        [string]$Address
    )
    $ping = ping $Address /w 1 /n 1
    $result = ![string]::IsNullOrEmpty($ping -Like "*(perte 0%)*")
    return $result
} 
0
ответ дан Fourat 18 March 2019 в 15:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: