创建case-loop / switch-statement-type PowerShell函数的正确方法是什么?

时间:2018-03-22 17:15:10

标签: function powershell parameters

由于我可能在这里遇到了X-Y问题,我实际上正在编写一个相当大的脚本来处理Windows平台上的本地和基于云的用户的用户管理。这意味着使用Azure Active Directory凭据进行一些使用Active Directory凭据进行身份验证的本地服务以及一些基于云的服务。理想情况下,会有一组凭据可以执行所有操作,但我不能依赖它,这使我找到一种获取大量凭据(我达到约8)的方法被发送到我写过的相应Connect-[Service]函数。

我认为编写此函数的正确方法是使用switch语句,如下所示:

Function Get-Credentials {
    Param (
        [Parameter(Mandatory=$true)][string]$Service
    )

    $global:Service1Credentials = $null;
    $global:Service2Credentials = $null;
    ...

    switch ($Service)
    {
        Service1 { $global:Service1Credentials = Get-Credential  -Message "Credentials for [Service1]"}
        Service2 { $global:Service2Credentials = Get-Credential  -Message "Credentials for [Service2]"}
        ...
    }
}

忽略全局参数的使用(我在编写脚本时我正在做的是为了更好的可调试性),这是解决脚本使用凭证来解决几个到十几个不同服务的问题的正确方法,或者我应该使用更好的方法吗?

1 个答案:

答案 0 :(得分:1)

随着交换机选项的增长,这是一个不那么麻烦的替代方案:

function Get-SvcCred($ServiceName)
{
    return (Get-Credential  -Message "Credentials for $ServiceName")
}

$services = "Service1", "Service2", "Service3"

$creds = @{}

$services | 
    ForEach-Object {
        $creds[$_] = Get-SvcCred $_
    }

现在,您需要做的就是在添加新服务时更新$ services数组,这将依次正确地请求每个数组。额外的好处是,您可以通过执行以下操作轻松访问代码中的任何凭据集:

$creds["Service1"]

显然,如果您不希望(或需要)用户立即提供所有凭据,您只需在需要时进行每次通话:

$creds["Service3"] = Get-SvcCred "Service3"