调用一个函数并从另一个函数传递一个返回值

时间:2018-02-02 10:10:20

标签: windows powershell

我有两个功能,但为什么它们不能一起工作?

function OnlineADComputer {
    Get-ADComputer -filter {(enabled -eq "True") -and (operatingsystem -like "windows*") -and (operatingsystem -notlike "*server*")} -properties *|sort Name | % {
        $rtn = Test-Connection -CN $_.name -Count 1 -BufferSize 16 -Quiet
        IF($rtn -match 'True') {
            Return $_.dnshostname
          }
        }
}

function Get-LoggedIn {
    [CmdletBinding()]Param(
        [Parameter(Mandatory=$True)]
        [string[]]$computername
    )
        ForEach ($pc in $computername){
            $logged_in = (gwmi Win32_ComputerSystem -Computer $pc).UserName
            $name = $logged_in.split("\")[1]
            "{0}: {1}" -f $pc,$name
    }
}

Get-LoggedIn OnlineADComputer - 所以不起作用,为什么?

1 个答案:

答案 0 :(得分:0)

当您运行Get-LoggedIn OnlineADComputer时,PowerShell会将此解释为Get-LoggedIn的调用,其中包含单个值的数组,即文字OnlineADComputer。我们可以用一些更简单的函数证明这一点:

Function Func1 { 
    'Hello!' 
}
Function Func2 { 
    [CmdletBinding()] Param(
        [Parameter(Mandatory=$true)][string[]]$text
    ) 
    $text | % { $_.ToUpper() } 
}

Func2 Func1返回FUNC1 - PowerShell试图通过让你在没有引号的情况下编写字符串文字来提供帮助。您可以通过将其括在括号中来明确表示要调用Func1Func2 (Func1)根据需要打印HELLO!。同样,Get-LoggedIn (OnlineADComputer)应该根据需要链接您的函数。

有趣的是,PowerShell控制台中的语法突出显示了对命令的解释。在无括号的版本中,Func1以白色呈现,并被解释为文本。在带括号的版本中,它是黄色并解释为命令。