PowerShell传递函数作为参数

时间:2017-12-05 14:45:06

标签: powershell parameter-passing

我有两个PS脚本(1个主脚本,1个作为模块)。

主脚本使用如下代码:

Write-Host "Press Y to continue"
Execute (ConstructSshSessions)

其中Execute是一个函数,要求问题继续并在函数ConstructSshSessions中执行脚本。如果用户未键入Y,则主脚本会跳过函数ConstructSshSessions

模块使用如下代码:

Function Execute($function)
{
    $response = read-host
    Write-Host "You typed: $response"
    if ($response -eq "Y")
    {
        $function
    }
    Remove-Variable response
}

当我执行代码Excecute (ConstructSshSession)时,它首先运行创建SSH会话的脚本,然后要求用户继续。所以这显然不是我的意图,但我没有看到错误。

我希望它询问用户是否可以继续,然后执行作为参数发送到函数Execute的脚本。

1 个答案:

答案 0 :(得分:1)

我不建议将实际读取响应的响应提示分开。我不建议将函数名称传递给某些Exec - 就像调用例程一样。

将确认例程包装在一个返回布尔值的函数中,并调用该函数作为if语句的条件。

function ConfirmStep($msg) {
    $title = 'Confirm Step'

    $yes = New-Object Management.Automation.Host.ChoiceDescription '&Yes'
    $no  = New-Object Management.Automation.Host.ChoiceDescription '&No'
    $options = [Management.Automation.Host.ChoiceDescription[]]($no, $yes)
    $default = 1  # $yes

    [bool]$Host.UI.PromptForChoice($title, $msg, $options, $default)
}

if (ConfirmStep "Construct SSH sessions?") {
    ConstructSshSessions
}