如何为定制模块中定义的powershell函数定义更多公共参数?

时间:2012-02-27 18:00:40

标签: powershell refactoring powershell-v2.0 powershell-module

我正在编写一个PowerShell模块来与AWS进行交互。大多数功能需要采用要使用的凭据参数 - awsAccessKeyIdawsSecretKeycredentialsFile

将这些参数复制/粘贴到模块中的每个函数。

有没有办法声明模块导出的函数集是CommonParameters

另外,有没有办法提取公共(即重复)参数集处理switch语句,以便所有需要它的函数调用它?

这是一个示例函数:

function New-S3Client {
    [CmdletBinding(DefaultParametersetName="credentialsFile")]
    param
    (
        [parameter(Mandatory=$true, ParameterSetName="specifyKey")] [string]$accessKey,
        [parameter(Mandatory=$true, ParameterSetName="specifyKey")] [string]$secretKey,
        [parameter(ParameterSetName="credentialsFile")] [string]$credentialsFile = "$env:USERPROFILE\.aws\credentials"
    )
    switch($PsCmdlet.ParameterSetName)
    {
        "specifyKey" {
            $env:awsAccessKeyId = $accessKey
            $env:awsSecretKey = $secretKey
            break
        }
        "credentialsFile" {
            $env:awsAccessKeyId = Read-ValueForKeyFromFile -from $credentialsFile -field AWSAccessKeyId
            $env:awsSecretKey = Read-ValueForKeyFromFile -from $credentialsFile -field AWSSecretKey
            break
        }
    }
    $config = New-Object Amazon.S3.AmazonS3Config
    $config.WithServiceURL("https://s3.eu-west-1.amazonaws.com")
    $client = New-Object Amazon.S3.AmazonS3Client($env:awsAccessKeyId, $env:awsSecretKey, $config)
    return $client
}

我想将参数2-4包含到CommonParameters,然后切换到一些常用函数。

1 个答案:

答案 0 :(得分:0)

我遇到的大多数模块都使用Connect-SomeService功能,然后处理模块状态下的连接/凭证。也许它的一些部分暴露在调用者会话中(数组变量跟踪连接)。

与VMware PowerCLI一样......

Connect-VIServer

Get-VM

这样您只需在Connect-S3Service函数中请求凭据。该命令将连接保存在一个默认情况下所有其他函数都使用的变量中。但是这样做意味着你仍然希望在所有其他函数中都有一个$ S3Service公共参数(如果你只想将作业发送到特定的连接),但至少有两个参数更少。