如何将Powershell函数作为参数分配给其他函数';s参数

如何将Powershell函数作为参数分配给其他函数';s参数,powershell,scripting,Powershell,Scripting,所以,我有两个功能: 第一个功能: function FunctionExecutor { param ( $function ) } function StartSSHsession { Write-Host "Hi" } 第二个功能是: function FunctionExecutor { param ( $function ) } function StartSSHsession {

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

function FunctionExecutor
{
    param
    (
        $function
    )
}
function StartSSHsession
{   
    Write-Host "Hi"
}
第二个功能是:

function FunctionExecutor
{
    param
    (
        $function
    )
}
function StartSSHsession
{   
    Write-Host "Hi"
}
问题:如何通过将StartShsSession传递到FunctionExecuter来执行它

这是什么也不执行

FunctionExecutor -function: StartSSHsession
一种方法是:

记住你只是在传递名字


使用附加参数和使用自动变量的示例:

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

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

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

…这将产生:

Hi: Bar
或者,您可以将要单独传递给脚本块的参数作为参数直接传递给
CodeExecutor
,后者可以将其作为
和$ScriptBlock…


至于你所尝试的

这是不执行任何操作。
FunctionExecutor-函数:StartSSHsession


您没有向我们展示您在
FunctionExecutor
内部对参数
$Function
所做的操作,但是,在没有显式键入参数的情况下,传递的特定令牌-
StartSSHsession
-被解释为字符串
[System.string]

您希望通过这样做实现什么?我想参数化一个发送电子邮件的函数,我想在另一个具有动态参数的函数中使用send email函数。您想要的已经内置到PowerShell中。它被称为。太好了,所以当我运行FunctionExecutor-function StartShsSession时它工作了。我可以使用multip吗函数执行器中的le参数?例如?param($function,[Bool]useEmail)@Hashim77这是可行的-请参阅编辑。我建议
[switch]
跳过
[Bool]
除非您有使用它的特定原因。此外,除非
函数执行器
将运行具有类似参数的类似函数,否则值得考虑另一种方法。例如,使用
启动会话
函数和其他函数