2016-03-22 115 views
0

我有以下的功能,顯示如果任何在array的話都包含在stringPowerShell的功能不執行如預期

function AnyOf ([string] $line, [string[]] $list) 
{ 
    Write-Output "AnyOf!" 
    foreach($item in $list) 
    { 
     if($line.Contains($item)) 
     { 
      Write-Output "Found: $item" 
      return $true 
     } 
    } 
    return $false 
} 

這對它進行測試:

function main 
{ 
    [string[]]$a = @("user1", "user2") 
    $str = "user1 and user2" 
    $res = AnyOf($str, $a) 
} 

我期望它看到user1user2打印出來,但沒有打印。看起來好像函數沒有被調用,因爲Write-Output "AnyOf!"從不執行。

然而,當我執行:

AnyOf($str, $a) 

相反的:

$res = AnyOf($str, $a) 

我可以看到,函數被調用,但迭代似乎並沒有發生...我是什麼做錯了?

回答

4

有幾件事情,

首先,在PowerShell中的功能不使用()叫你會調用該函數作爲

AnyOf $str $a

的標準約定是$<<nameOfFunction>> <<param1>> <<param2>>

其次,您的輸出在$res中被捕獲,因此如果在末尾添加$res,則不會將其打印到屏幕上它會輸出你的main function

所以,你的主要功能就變成了:

function main 
{ 
    [string[]]$a = @("user1", "user2") 
    $str = "user1 and user2" 
    $res = $AnyOf $str $a 
    $res #or just don't assign it to $res.. 
} 


#to call main: 
main 

Output: 

AnyOf! 
Found: user1 
True 

正如你可以在它從來沒有發現User2上面的輸出中看到,因爲你使用return $true一旦找到匹配,退出該功能的。

需要注意的另一件事是,當你return $false$true這些實際上成爲輸出流的一部分,這可能不是你想要的,因爲它可能導致意想不到的行爲。