0

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

这是我的功能:

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

这是我用来遍历由 CSV 创建和导入的数组的 ForEach 循环:

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

想法??顺便说一句,我已经在 powershell v2 和 v3 中尝试过这个

4

2 回答 2

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)也会奏效的。

于 2014-09-13T17:33:17.690 回答
0

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

ForEach ($Server in $ServerRoleArray) {
    if (!$Server.Role1) {
    break
    } else {
    CheckPorts $Server.Role1 "TCP" $Role1Ports
    }
}
于 2014-09-15T02:55:05.127 回答