2016-03-22 1 views
0

У меня есть следующая функция, которая показывает, если любое из слов в качестве array содержатся в string:функция Powershell не выполняется, как ожидалось

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

Я ожидаю, что он увидит как user1, так и user2, чтобы распечататься, но ничего не печатается. Похоже, что функция не вызывается, потому что 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, они фактически становятся частью выходного потока, который может быть не таким, каким вы хотите, поскольку это может привести к неожиданному поведению.