在PowerShell中传递PortQry参数

时间:2014-09-12 20:47:05

标签: powershell port portqry

我正在尝试验证是否已实施正确的防火墙规则且流程是否正常运行。我搜索过,似乎无法找到我的解决方案。我正在使用PowerShell为服务器列表自动化PortQry请求(基于它的角色),这似乎很简单。但我似乎无法正确地将参数传递给PortQry并最终得到PortQry帮助屏幕。

这是我的功能:

  Function CheckPorts($x,$y,$z) {
    PortQry -n $x -p $y -o $z | Out-File $ResultsFile -Append
    }

这是我的ForEach循环,我用它来迭代由CSV创建并导入的数组:

  $Type = TCP      
   Foreach ($Server in $ServerRoleArray.Role1) {
            if ($Server -ne "") {
            CheckPorts $Server $Type $Role1Ports
        }

添加信息 好像我没有正确地从数组中提取$Server变量。这是我的导入:

$ServerRoleArray = Import-CSV $FilePath\Servers.csv

我的Servers.csv看起来像:

Role1,Role2
google.com,msn.com
yahoo.com,

思考?? BTW我在powershell v2& V3

2 个答案:

答案 0 :(得分:0)

我确定这是发送到PortQry的命令行参数的问题,看起来并不像您期望的那样。 我仍然不知道你的$Role1Ports是什么样的,这可能是你的困境的根源。假设您已将其声明为$Role1Ports = "80,443"

Function CheckPorts($x,$y,$z) {
    PortQry -n $x -p $y -o `"$z`" | Out-File $ResultsFile -Append
}

$ServerRoleArray = Import-Csv C:\temp\server.tkt.txt
$Role1Ports = "80,443"

$Type = "TCP"      
Foreach ($Server in $ServerRoleArray.Role1) {
    if ($Server -ne "") {
    CheckPorts $Server $Type $Role1Ports
    }
}

需要在"TCP"上加上引号,以便将其解释为字符串。我能看到你的ForEach循环没有错。我使用了您的测试示例数据并且处理得很好。我在$z函数中包含了CheckPorts,以便z$中的端口也可以正常传递。这是根据我在网上找到的PortQry的例子完成的

如果您的$ Role1Ports看起来像这样:$Role1Ports = 80,443或者是某种形式的数组,那么您可以执行其中任何一种操作,而我上面使用的代码仍可以使用。

$Role1Ports = $Role1Ports -join ","

$Role1Ports = 80,443 -join ","

你应该得到的命令输出是这样的。

PortQry -n google.com -p TCP -o "80,443"
PortQry -n yahoo.com -p TCP -o "80,443"

由于其他答案

我不知道为什么你的逻辑有问题,因为它工作正常。根据您的评论我使用了不同的文本文件。

Role1,Role2
,msn.com
google.com,
yahoo.com,

即使使用if ($Server -ne "")语句,它仍然有用。 if ($Server)也会奏效。

答案 1 :(得分:0)

我的ForEach循环错了。存在2个问题:首先,空检查不正确,并且对列的调用不正确。这是正确的循环:

ForEach ($Server in $ServerRoleArray) {
    if (!$Server.Role1) {
    break
    } else {
    CheckPorts $Server.Role1 "TCP" $Role1Ports
    }
}