Powershell参数传入for循环函数

Powershell parameters passing in for loop to function

我是 powershell 的新手,我有一个特定的任务,想在 powershell 中创建一个端口扫描器,允许将 foreach 循环中的参数传递给函数中的特定参数。

该函数称为 testport,当 运行在 for 循环中调用该函数时,我想传递的特定参数是 $a - 这将是我有兴趣扫描的 IP 列表。这是函数:

function testport ($hostname='10.0.0.$a',$port=445,$timeout=100) {
$requestCallback = $state = $null
$client = New-Object System.Net.Sockets.TcpClient
$beginConnect = $client.BeginConnect($hostname,$port,$requestCallback,$state)
Start-Sleep -milli $timeOut
if ($client.Connected) { $open = $true } else { $open = $false }
$client.Close()
[pscustomobject]@{hostname=$hostname;port=$port;open=$open}

foreach 循环到 运行 函数看起来像这样:

foreach ($a in 1..255) {testport}

当 运行 时,它 运行 多次针对 10.0.0.$a,而不是 10.0.0.1、10.0.0.2 等。 我怎样才能使这个 运行 正确?

您不能在您的函数中使用 $a $hostname 参数默认值,因为 $a 在 powershell 到达 foreach 语句之前不存在(在它已经读取您的函数之后)。充其量 $a 已经存在并具有一些未知值,或者它根本不存在 - 无论哪种方式你都会得到错误的输出。你的路线是正确的,但你需要做一些调整...

我建议您使测试函数通用(因此它接受普通 IP),然后在您的 for 循环中放置您的逻辑以生成要扫描的 IP。

因此您的 for 循环可能类似于:

foreach ($a in 1..255) {
  Write-Host "Testing ports on 10.0.0.$a";
  testport -hostname "10.0.0.$a"
}

然后我将更改函数签名以删除 $hostname 的默认值 ('10.0.0.$a')。您的 testport 函数声明应如下所示:

function testport ($hostname,$port=445,$timeout=100)

(注意:如果您显式传递 $hostname 一个值,它将使用该值而不是默认值 - 但考虑到 IP 总是不同的,给它一个默认值可能没有意义)