我认为此if
声明存在问题。
Function Get-IsFirewallProfileEnabled([string]$profile)
{
Return [bool](Get-NetFirewallProfile -name "Domain" | Where Enabled -eq "False")
}
# If the firewall for some of the 3 profiles is not enabled
if ( ((Get-IsFirewallProfileEnabled("Domain")) -or (Get-IsFirewallProfileEnabled("Private")) -or (Get-IsFirewallProfileEnabled("Public"))) -eq "False")
{
Write-Output "Enabling..."
# Enable Windows firewall for for all (the 3 profiles)
Set-NetFirewallProfile -Profile Domain,Private,Public -Enabled True
}
无论我是否激活了防火墙,此脚本始终无效。发生了什么事?
解
# Now this function is dynamic
Function Get-IsFirewallProfileEnabled([string]$profile)
{
Return [bool](Get-NetFirewallProfile -name $profile | Where Enabled -eq "True")
}
# If the firewall for some of the 3 profiles is not enabled
if ( -not(Get-IsFirewallProfileEnabled("Domain")) -or -not(Get-IsFirewallProfileEnabled("Private")) -or -not(Get-IsFirewallProfileEnabled("Public")) )
{
Write-Output "Enabling..."
# Enable Windows firewall for for all (the 3 profiles)
Set-NetFirewallProfile -Profile Domain,Private,Public -Enabled True
}
答案 0 :(得分:2)
正如罗伯特所说,您使用的是字符False
,而不是$false
语句中的布尔if
。
但是if
声明中的逻辑并没有按预期运行:
if(((Boolean) -or (Boolean) -or (Boolean)) -eq $false)
不会在Powershell中产生所需的结果(只有在所有值都为$false
时才会执行)。由于if
总是在$true
上执行,因此只需-not
Get-IsFirewallProfileEnabled
来if((-not(Get-IsFirewallProfileEnabled("Domain")) -or (-not(Get-IsFirewallProfileEnabled("Private")) -or (-not(Get-IsFirewallProfileEnabled("Public")))
就可以达到预期效果:
if
当任何值为$false
时,这将执行{{1}}块。
答案 1 :(得分:1)
您想使用$false
而不是"False"
。
"假"是字符串文字,如果条件((Get-IsFirewallProfileEnabled("Domain")) -or (Get-IsFirewallProfileEnabled("Private")) -or (Get-IsFirewallProfileEnabled("Public")))
返回的布尔值为false,则永远不会匹配。
例如:
if ("False") { write-host "true" }
上面的行总是会写出" true"给主人。这是因为非空字符串文字等于$ true。
下面这一行永远不会写出#34; true"对主持人。
if ($false) { write-host "yes" }