首页 > 解决方案 > Powershell:您不能在空值表达式上调用方法

问题描述

我有个问题。我正在制作一个端口扫描仪,如果它打开与否,我想为它扫描的每个端口制作工作。

$endport = 100
$timeout = 100
$ipadres = "192.168.0.137" 

$testPort = { 
Param($port)
    $tcpClient.ConnectAsync($ipadres, $port).Wait($timeout)
} 


For($i=1; $i -le $endport; $i++) {
    Start-Job -scriptblock $testPort -ArgumentList $i 
}
Get-Job | Wait-Job 
$out = Get-Job | Receive-Job 
$out

所以在这个例子中,我想从端口 1 扫描 ip 地址 192.168.0.137 到 100。但是当我运行它并显示我的工作结果时,我得到了这个错误

You cannot call a method on a null-valued expression.
    + CategoryInfo          : InvalidOperation: (:) [], RuntimeException
    + FullyQualifiedErrorId : InvokeMethodOnNull
    + PSComputerName        : localhost

有人知道我该如何解决这个问题吗?

标签: powershell

解决方案


尽管您在评论中发现了问题,但请快速说明一下 - 在您的情况下使用作业确实是矫枉过正。每个作业都会创建子进程,并且会占用你几 MB 的内存。您已经在使用任务(通过调用 Async 方法),所以坚持下去。例如



$tasks = foreach($i in 1..100) {
  $tcpClient = [System.Net.Sockets.TcpClient]::new()
  $tcpClient.ConnectAsync($ipadres, $i)
 }

[System.Threading.Tasks.Task]::WaitAll($tasks)

$tasks | select id,  status, result | format-table

推荐阅读