我想知道为什么我的脚本花了这么长时间,所以我一直在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"
}
}
效果不错,速度更快
答案 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名称传递给工作流程。
我只是在自己的计算机上做睾丸,它给了我一个答复...