Start-Job 脚本块中的 if 语句

if statement in Start-Job scriptblock

我正在尝试使用 PowerShell 创建一个简单的网络扫描器,我希望它可以并行 运行 多个 "pings (or in this case test-connection)"。

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 语句,则写入文件部分有效。

所以问题似乎出在作业的脚本块中使用 if 语句时。

一定是我遗漏了 start-job 命令。 或者有没有更好的方法来创建这种脚本?

$item 在脚本块范围内不可用,因此您需要将值作为参数传入。

$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
}