我尝试使用PowerShell创建一个简单的网络扫描程序,我希望它能够运行多个ping(或者在这种情况下是测试连接)"并行。
Start-Job似乎是实现这种多线程场景的最佳方式。
以下是我尝试做的简化示例。
$list=@("192.168.1.1", "192.168.1.2", "192.168.1.3", "192.168.1.4")
ForEach ($item In $list) {
Start-Job -ScriptBlock {
if (Test-Connection $item -Quiet -Count 1) {
Add-Content -value "$item found" -Path C:\logs\test.txt
}
}
}
然而,这没有任何作用。 如果我删除了Start-Job部分它确实有效,但是它失去了多处理功能。 如果我删除if语句,则写入文件部分可以正常工作。
所以问题似乎是在作业中的scriptblock中使用if语句时。
我必须要找到一些关于起步工作命令的事情。 或者有没有更好的方法来创建这种脚本?
答案 0 :(得分:0)
$ item在scriptblock范围内不可用,因此您需要将值作为参数传递。
$list=@("192.168.1.1", "192.168.1.2", "192.168.1.3", "192.168.1.4")
ForEach ($item In $list) {
Start-Job -ScriptBlock {
param($item)
if (Test-Connection $item -Quiet -Count 1) {
Add-Content -value "$item found" -Path C:\logs\test.txt
}
} -argumentlist $item
}