Powershell中缓慢的处理脚本,Worklfow的第一步

时间:2019-03-18 13:39:53

标签: powershell

我想知道为什么我的脚本花了这么长时间,所以我一直在Google上搜寻,也在stackoverflow中搜寻。<​​/ p>

但是我能找到的几乎所有有用的东西就是这里的Powershell Script Running Slowly

由于我对Powershell还是很陌生,因此完成并接管我的脚本有点复杂,因为我不知道如何处理这些提到的事情,因为我以前从未听说过。

“我的脚本”非常简单,如果有东西返回或不返回回显,它只会为我提供一些信息。

我想“扫描”整个网络,所以我制作了一个没有本地网络IP的csv,并将其传递给Powershell来“ ping”那些IP。

但是我意识到执行“不响应”部分需要很长时间。

$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不是一个选择,否则我不知道该如何实现

编辑:

输入工作流程后,这是我的“试用版”

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 个答案:

答案 0 :(得分:2)

我认为超时会破坏您的处理时间。如果您所有的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 :(得分:1)

我已经使用Workflow自己解决了这个问题。是几年前我做的,所以有更好更好的新东西了。但这对我很有用... 我已经在几分钟内对2,000台计算机进行了ping操作...

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 ...)语句,以确保将PC名称传递给工作流程。

我只是在自己的计算机上做睾丸,它给了我一个答复...