如何将Powershell函数作为参数分配给不同函数的参数

时间:2018-03-05 22:32:47

标签: powershell scripting

所以,我有两个功能: 第一个功能:

function FunctionExecutor
{
    param
    (
        $function
    )
}

第二个功能是:

function StartSSHsession
{   
    Write-Host "Hi"
}

问题:如何通过将StartSSHSession传递给FunctionExecuter来执行它?

这不执行任何操作。

FunctionExecutor -function: StartSSHsession

2 个答案:

答案 0 :(得分:1)

一种方法是dot-source

function FunctionExecutor
{
    param
    (
        $function
    )
    . $function
}

请记住,你只是传过这个名字。

使用其他Switch参数并使用$PSBoundParameters自动变量的示例:

function StartSSHsession
{   
    param(
        [switch]$useEmail
    )
    if($useEmail){
        Write-Host "Use Email"
    }else{
        Write-Host "Hi"
    }
}

function FunctionExecutor
{
    param
    (
        [switch]$useEmail,
        $function
    )
    . $function @PSBoundParameters
}

答案 1 :(得分:0)

PowerShell传递代码的方式是通过脚本块 [scriptblock]类型的实例,您可以使用{ ... } 逐字地 创建并传递为& 执行,呼叫运营商。

因此,请按如下方式定义您的功能:

function CodeExecutor
{
    # Make the function an *advanced* function, which prevents attempts to
    # use undeclared parameters.
    [CmdletBinding()] 
    param
    (
        # Define the piece of functionality to accept as a [scriptblock]
        [scriptblock] $ScriptBlock
    )

    # Invoke the script block with `&`
    & $ScriptBlock
}

现在,之后定义StartSSHsession ...

function StartSSHsession {
   param(
     $Foo
   )
   Write-Host "Hi: $Foo"
}

...您可以使用带参数的脚本块将其传递给CodeExecutor,如下所示:

CodeExecutor -ScriptBlock { StartSSHsession Bar }

......产生:

Hi: Bar

或者,您可以将参数单独传递给脚本块,作为CodeExecutor的参数直接传递,然后可以将其传递给& $ScriptBlock ...

至于您尝试的内容

  

这一切都没有执行   FunctionExecutor -function: StartSSHsession

您没有向我们展示您在$Function内使用参数FunctionExecutor所做的事情,但是,如果没有明确的输入参数 ,传递的特定令牌 - StartSSHsession - 被解释为字符串 [System.String]