我有以下用于创建 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)来测试这段代码。为了做到这一点,我将 cmdlet 调用包装在我称之为代理函数的地方,并使用 splatting 传递参数值,这使得为了测试目的而模拟它们变得容易。这是一个例子:
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 技能/知识让我失望,所以我希望有人能告诉我如何重写我的函数以成功接受和使用管道输入。
这是我正在为其编写代理函数的 cmdlet 的定义:Set-AzureHDInsightDefaultStorage。我注意到 -Config 参数设置为允许管道输入: 所以我想我需要在代理函数中指定相同的参数,但我不知道该怎么做。