1

HDInsight クラスターを作成するために使用される次の作業コードがあります。

New-AzureHDInsightClusterConfig    -ClusterSizeInNodes $ClusterNodes  `
                                                -VirtualNetworkId ($VNet.Id)       `
                                                -SubnetName $subnetName            `
                                                -ClusterType $ClusterType |        `
                    Set-AzureHDInsightDefaultStorage   -StorageAccountName        "$StorageAccountName.blob.core.windows.net"  `
                                                            -StorageAccountKey         $StorageAccountKey                           `
                                                            -StorageContainerName      $StorageContainerName |                      `
                    New-AzureHDInsightCluster          -Credential                $ClusterCreds                                `
                                                            -Location                  $Location                                    `
                                                            -Name                      $ClusterName                                 `
                                                            -Version                   $HDInsightVersion

パイプラインを使用していることに注意してください。ここで、このコードをテストするために( Pesterを使用して) 自動化されたテストを書きたいと思います。そのために、私はプロキシ関数と呼ばれるものでコマンドレット呼び出しをラップし、スプラッティングを使用してパラメーター値を渡します。これにより、テスト目的でそれらを簡単にモックできます。次に例を示します。

function Set-AzureHDInsightDefaultStorageProxy{
<#
    .SYNOPSIS 
      Wrap Azure cmdlet Set-AzureHDInsightDefaultStorage thus enabling mocking
    .DESCRIPTION
      Wrap Azure cmdlet Set-AzureHDInsightDefaultStorage thus enabling mocking
#>
    [CmdletBinding()]
    Param(
        $StorageAccountName,
        $StorageAccountKey,
        $StorageContainerName
    )
    Set-AzureHDInsightDefaultStorage @PSBoundParameters
}
New-AzureHDInsightClusterConfigProxy    -ClusterSizeInNodes $ClusterNodes  `
                                                -VirtualNetworkId ($VNet.Id)       `
                                                -SubnetName $subnetName            `
                                                -ClusterType $ClusterType |        `
                    Set-AzureHDInsightDefaultStorageProxy   -StorageAccountName        "$StorageAccountName.blob.core.windows.net"  `
                                                            -StorageAccountKey         $StorageAccountKey                           `
                                                            -StorageContainerName      $StorageContainerName |                      `
                    New-AzureHDInsightClusterProxy          -Credential                $ClusterCreds                                `
                                                            -Location                  $Location                                    `
                                                            -Name                      $ClusterName                                 `
                                                            -Version                   $HDInsightVersion

このコードを実行しようとすると、エラーが発生します。

Set-AzureHDInsightDefaultStorageProxy -StorageAccountName ... + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~ [<<==>>] 例外:コマンドがパイプライン入力を使用しないか、入力とそのプロパティがパイプライン入力を使用するパラメーターのいずれとも一致しないため、入力オブジェクトをコマンドのパラメーターにバインドできません。

では、パイプライン入力を受け入れるように関数を変更する必要があります。Write PowerShell Functions That Accept Pipelined Input を読み、それに基づいてプロキシ関数を次のように書き直しました。

function Set-AzureHDInsightDefaultStorageProxy{
    [CmdletBinding()]
    Param(
        $StorageAccountName,
        $StorageAccountKey,
        $StorageContainerName
    )
    Set-AzureHDInsightDefaultStorage -Config $input -StorageAccountName $StorageAccountName -StorageAccountKey $StorageAccountKey -StorageContainerName $StorageContainerName
}

しかし、それは同じエラーで失敗しました。

明らかに、Powershell のスキル/知識が不足しているため、ここで失望しているので、関数を書き直してパイプライン入力を正常に受け入れて使用する方法を誰かが教えてくれることを願っています。

プロキシ関数を記述しているコマンドレットの定義は次のとおりです: Set-AzureHDInsightDefaultStorage。-Config パラメーターがパイプライン入力を許可するように設定されていることに気付きました。 ここに画像の説明を入力 そのため、プロキシ関数で同じことを指定する必要があると思いますが、その方法がわかりません。

4

1 に答える 1

1

OK、私はそれを理解したと思います:

function Set-AzureHDInsightDefaultStorageProxy{
<#
    .SYNOPSIS 
      Wrap Azure cmdlet Set-AzureHDInsightDefaultStorage thus enabling mocking
    .DESCRIPTION
      Wrap Azure cmdlet Set-AzureHDInsightDefaultStorage thus enabling mocking
#>
    [CmdletBinding()]
    Param(
        [Parameter(ValueFromPipeline=$true)]$Config,
        $StorageAccountName,
        $StorageAccountKey,
        $StorageContainerName
    )
    Set-AzureHDInsightDefaultStorage -Config $input -StorageAccountName $StorageAccountName -StorageAccountKey $StorageAccountKey -StorageContainerName $StorageContainerName
}

パイプラインで前のコマンドレットから正しい値を渡していないため、エラーが発生しているため、まだうまく機能していません。

エラー: 2014 年 8 月 12 日 12:19:55: E:\DeployUtilities.psm1:984 文字:21 + Set- AzureHDInsightDefaultStorageProxy
-StorageAccountName ... + ~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~ [<<==>>] 例外: 'System.Object[]' をタイプ 'Microsoft.WindowsAzure.Management.HDInsight.Cmdlet.DataObjects に変換できません.AzureHDInsightConfig' は、パラメーター 'Config' で必要です。指定された方法はサポートされていません。--> 指定されたメソッドはサポートされていません。

しかし、それは別の (自明の) 問題であり、これから解決に向けて努力します!

于 2014-12-08T12:22:14.683 に答える