【问题标题】:Powershell parameters passing in for loop to functionPowershell参数传入for循环以发挥作用
【发布时间】:2021-11-17 18:34:15
【问题描述】:

我是 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 等。 我怎样才能使它正常运行?

【问题讨论】:

  • 你在这里做的有点反模式,但你可以通过在参数列表中将'10.0.0.$a'更改为$("10.0.0.$a")来使其工作

标签: powershell parameters


【解决方案1】:

你不能在你的函数中使用$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 总是不同的,给它一个默认值可能没有意义)

【讨论】:

  • 成功了!非常感谢您的透彻解释,看起来像这样: function testport ($hostname=$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 ($a in 1..190) {testport -hostname "10.0.0.$a"}
猜你喜欢
  • 2018-12-09
  • 1970-01-01
  • 1970-01-01
  • 2018-08-21
  • 2012-06-08
  • 2020-09-21
  • 1970-01-01
  • 2020-01-27
  • 1970-01-01
相关资源
最近更新 更多