如何在Powershell中的函数中传递多个参数?

时间:2019-01-09 11:08:45

标签: azure powershell powershell-v4.0 azure-powershell

我试图在Azure的自动化帐户中为Runbook运行Powershell脚本。我正在使用一个函数来传递多个参数。该Runbook用于还原VM的磁盘。但是从我正在使用的代码结构来看,我似乎不能传递多个1 Resource Name。我如何重组此代码,或者如何构架函数或脚本中的任何行,以便传递多个“资源名称”(在这种情况下为VM名称)?

当前,我只能在函数中传递一个资源名称,但我需要传递两个VM名称。

function DiskRestore($ResourceName, $storageAccount)
{

 try
 {
  .....
  .....
  .....
       $resources = Get-AzureRmResource -ResourceGroupName"samplerg" -ResourceName  $ResourceName

  .....
  .....
  .....
       $restorejob = Restore-AzureRmRecoveryServicesBackupItem -RecoveryPoint $rp[0] -StorageAccountName $storageAccount -StorageAccountResourceGroupName "samplerg"

  .....
  .....
  .....
  }
  }

  DiskRestore -ResourceName "samplevm01" -storageAccount "samplesa01"

因此,在上述功能中,我如何除了samplevm01之外再传递一个VM名称。如何通过samplevm02?存储帐户保持不变。提前致谢。

2 个答案:

答案 0 :(得分:0)

Vesper所述,更改参数定义以接收字符串数组,并使用foreach{..}遍历该数组。 就我个人而言,我可以通过将参数放在Param()块中来创建一个“高级函数”,从而对此进行一些扩展。这样,该函数会自动获得额外的常用PowerShell参数,例如ErrorActionVerbose等。 另外,我将重命名该函数,使其符合PowerShell函数的Verb-Noun命名约定。

类似这样的东西:

function Restore-Disk {
    [CmdletBinding()]
    Param (
        [Parameter(Mandatory = $true, Position = 0)]
        [string[]]$ResourceName,

        [string]$ResourceGroupName = 'samplerg',  # add a default name for this parameter

        [string]$StorageAccount = 'samplesa01',   # add a default name for this parameter

        [Parameter(Mandatory = $true)]
        $RecoveryPoint
    )
    foreach ($resource in $ResourceName) {
        try {
            #  .....
            # This will only print to the console is the -Verbose parameter is used on the function
            Write-Verbose "Retrieve resource '$resource' in group '$ResourceGroupName'"
            $resources = Get-AzureRmResource -ResourceGroupName $ResourceGroupName -ResourceName  $resource
            #  .....
            Write-Verbose "Restoring data and configuration for group '$ResourceGroupName'"
            $restorejob = Restore-AzureRmRecoveryServicesBackupItem -RecoveryPoint $RecoveryPoint -StorageAccountName $StorageAccount -StorageAccountResourceGroupName $ResourceGroupName
            #  .....
        }
        catch {}
    }
}

# Because the parameters ResourceGroupName and StorageAccount have default values, you do not have to specify them
# in the call to the function unless the are different than the default values.
Restore-Disk -ResourceName "samplevm01","samplevm02" -RecoveryPoint $rp[0] -Verbose

答案 1 :(得分:0)

如果要在powershell runbook中运行Powershell,则可以仅以字符串类型传递虚拟机名称,并以逗号分隔,例如“ vm1,vm2,vm3”。然后在您的Runbook代码中,将字符串拆分为数组,然后在foreach循环中,对每个vm进行操作。

在Powershell Runbook中进行简单测试:

param([string]$ResourceName,[string]$StorageAccount)

#parse the string to an array
$vms = $ResourceName.split(',')

#implement your logic here
foreach($r in $vms)
{   
   #output the vm name
   $r
}

#output the storage account
$StorageAccount

传递参数并运行:

enter image description here

对于您的代码,您可以按照上述步骤进行操作,Runbook中的代码应如下所示:

param([string]$ResourceName,[string]$StorageAccount)

$vms = $ResourceName.split(',')

foreach ($resource in $vms) {
        try {
            #.....
            $resources = Get-AzureRmResource -ResourceGroupName "samplerg" -ResourceName  $resource

            $restorejob = Restore-AzureRmRecoveryServicesBackupItem -RecoveryPoint $rp[0] -StorageAccountName $StorageAccount -StorageAccountResourceGroupName "samplerg"

           #....
        }
        catch {}
    }