在Start-Job scriptblock中的if语句

时间:2018-03-23 18:01:33

标签: powershell if-statement start-job

我尝试使用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语句时。

我必须要找到一些关于起步工作命令的事情。 或者有没有更好的方法来创建这种脚本?

1 个答案:

答案 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
}