Powershell函数未按预期执行

时间:2016-03-22 05:08:47

标签: powershell windows-scripting

我有以下功能,可以显示array中是否包含string中的任何字词:

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)

我可以看到函数被调用但迭代似乎没有发生......我做错了什么?

1 个答案:

答案 0 :(得分: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这些实际上成为输出流的一部分时,可能不是您想要的,因为它可能会导致意外行为。