我正在尝试验证是否已实施正确的防火墙规则且流程是否正常运行。我搜索过,似乎无法找到我的解决方案。我正在使用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
答案 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
}
}