Скрипт медленной обработки в Powershell, первые шаги Worklfow - PullRequest
0 голосов
/ 18 марта 2019

, как мне было интересно, почему мой сценарий занимает так много времени, я искал на Google, а также здесь, в stackoverflow.

Но все, что я мог найти, что-то похожее на полезное, было вот здесь, Скрипт Powershell работает медленно

Поскольку я все еще довольно новичок в Powershell, мне немного сложно разобраться с моим сценарием, так как я все равно не знаю, как обращаться с упомянутыми вещами, поскольку я никогда не слышал об этом раньше.

Мой сценарий довольно прост и просто дает мне некоторую информацию, если есть что-то, что возвращает эхо или нет.

Я хотел «просканировать» всю нашу Сеть, поэтому я сделал CSV без IP-адресов локальных сетей и передал его в Powershell, чтобы «пинговать» их.

Но я понял, что выполнение части «не отвечает» занимает много времени.

$list = Import-Csv -Path D:\ipcheck3.csv -UseCulture
$x=$list.IP
$ErrorActionPreference = "SilentlyContinue"
foreach ($y in $x)
{

    try
    {
        if(Test-Connection $y -Count 1 -quiet)
        {
            write-host "$y responded" 
            $y | Export-Csv -Path D:\PingSucceded.csv -Append
        }
        else
        {
            Write-Host "$y was not responding"
            $y | Export-Csv -Path D:\Pingfailed.csv -Append
        }
    }
    catch
    {
        Write-Warning "Other Error occured" 
    }

}

Есть не только клиенты Windows, поэтому WMI не вариант, и я не знаю, как этого добиться в противном случае

EDIT:

После ввода в рабочий процесс это моя «пробная версия»

workflow Test-IPrange
{
    Param
    (       
        $IPs
    )

    $tocheck= $IPs.IP

    foreach -parallel ($IP in $tocheck)
    {
        $pingsucceed = Test-Connection $IP -Count 1 -quiet

        if($pingsucceed -eq "True")
        {
            $IP | Export-Csv -Path D:\testj.csv -Append
        }
        else
        {
            $IP | Export-Csv -Path D:\testn.csv -Append
        }
    }
}

Test-IPrange -IPs $(Import-Csv -Path D:\ipcheck3.csv -UseCulture)

Мой вывод рабочего процесса Попробуйте

#TYPE System.String
PSComputerName,"PSShowComputerName","PSSourceJobInstanceId","Length"
localhost,"True","4e208e38-f7c2-492f-9d81-6583a103c3ac","12"
localhost,"True","4e208e38-f7c2-492f-9d81-6583a103c3ac","12"

С помощью @ Fourat

я отредактировал свой код в этой форме

Function Custom-Ping {
    Param(
        [string]$Address
    )
    $ping = ping $Address /w 1 /n 1
    $result = ![string]::IsNullOrEmpty($ping -Like "*(0% Verlust)*")
    return $result
} 

$list = Import-Csv -Path D:\ipcheck3.csv -UseCulture
$x=$list.IP
$ErrorActionPreference = "SilentlyContinue"
foreach ($y in $x)
{

    try
    {
        if(Custom-Ping $y)
        {           
            Write-Host "$y responded"
            $y | Export-Csv -Path D:\PingsuccededV3.csv -Append
        }
        else
        {

            Write-Host "$y was not responding"
            $y | Export-Csv -Path D:\PingfailedV3.csv -Append
        }
    }
    catch
    {
        Write-Warning "Textline from CMD Command or other Error" 
    }

}

, который работает правильно и быстрее

Ответы [ 2 ]

2 голосов
/ 18 марта 2019

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

Если у вас Powershell 6 :

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

Если вы этого не сделаете, просто используйте ping :

ping 58.47.45.1 /w 1 /n 1

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

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

ОБНОВЛЕНИЕ

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

Function Custom-Ping {
    Param(
        [string]$Address
    )
    $ping = ping $Address /w 1 /n 1
    $result = ![string]::IsNullOrEmpty($ping -Like "*(perte 0%)*")
    return $result
} 
1 голос
/ 18 марта 2019

Я сам использовал 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 ...), чтобы убедиться, что имя ПК передается в рабочий процесс.

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

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