我正在尝试扩展我编写的脚本(并在SO上获得用户的帮助)。它是一个Windows powershell脚本,可将IP添加到Windows防火墙的远程地址列表中。
我试图让它排除任何防火墙规则,其中远程地址已被指定为“LocalSubnet”。
这是我目前所拥有的,目前当我使用write-host而不是实际命令运行它时,它什么也没显示。
reloaddata
我在嵌套循环中丢失了......我甚至需要嵌套循环吗?我尝试了一些,并做循环也无济于事。
@Matt-谢谢!这是正确的脚本。
#This script will update remote address rules with the specified IP scope(s)
$displayname = read-host "Enter firewall rule display name"
$name = Get-NetFirewallRule -DisplayName $displayname |Where-Object {$_.Direction -eq "Inbound"}
$exclusion = Get-NetFirewallRule -DisplayName $displayname |Get-NetFirewallAddressFilter
$ips = @()
do {
$input = (Read-Host "Please enter IP address")
if ($input -ne '') {$ips += $input}
}
until ($input -eq '')
foreach ($r in $name)
{
foreach ($e in $exclusion){
if ($e.remoteaddress -NotMatch "LocalSubnet") {continue}
#Set-NetFirewallRule -DisplayName $r.DisplayName -RemoteAddress $ips
write-host $r.Displayname $ips
}
}
答案 0 :(得分:1)
如果我错了,我会删除它,但评论中的代码很糟糕。我正在更改变量的名称以具有更多含义。您拥有的内部循环不是必需的,会产生额外的输出。我们在这里所做的就是将条件构建到Where-Object
中。这将删除您尝试执行的排除逻辑。
$rules = Get-NetFirewallRule -DisplayName $displayname |
Where-Object {$_.Direction -eq "Inbound" -and ($_ | Get-NetFirewallAddressFilter).RemoteAddress -ne "LocalSubnet" }
# get ips .....
foreach ($rule in $rules)
{
# Do Stuff
}
$rules
现在应该只是您需要采取行动的那些。
注意:请勿使用$input
作为变量名称。它是PowerShell中的保留名称。有关更多信息,请参阅about_automatic_variables。在这种情况下,$answer
或$result
就足够了。