2016-03-22 66 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这些实际上成为输出流的一部分,这可能不是你想要的,因为它可能导致意想不到的行为。