2014-04-02 24 views
0

我認爲這個if語句存在問題。IF語句中的錯誤powershell

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 
} 

無論我是否激活了防火牆,該腳本始終不會執行任何操作。發生了什麼?


SOLUTION

# 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 
} 

回答

2

正如羅伯特所提到的,您使用的是串False,而不是布爾$falseif聲明。

但在你if語句中的邏輯不按預期工作:

if(((Boolean) -or (Boolean) -or (Boolean)) -eq $false) 

不會產生在PowerShell中(如果所有值都$false只會執行)所期望的結果。由於if總是$true執行,你可以通過簡單地從-not -ing Get-IsFirewallProfileEnabled的價值觀,像這樣達到預期的效果:

if((-not(Get-IsFirewallProfileEnabled("Domain")) -or (-not(Get-IsFirewallProfileEnabled("Private")) -or (-not(Get-IsFirewallProfileEnabled("Public"))) 

當任一值都$false這將執行if塊。

+0

是的,這個更好的IF語句沒有工作,所以我編程這個更糟的IF,哈哈,THX。 – user3270009

1

你想用$false"False"

「False」是一個字符串字面值,如果條件((Get-IsFirewallProfileEnabled("Domain")) -or (Get-IsFirewallProfileEnabled("Private")) -or (Get-IsFirewallProfileEnabled("Public")))返回的布爾值爲false,它將永遠不匹配。

例如:

if ("False") { write-host "true" }

線之上將總是寫 「真」 到主機。這是因爲非空字符串文字等於$ true。

下面的行永遠不會寫入「真」的主機。

if ($false) { write-host "yes" }