Как передать несколько параметров в функцию в Powershell? - PullRequest
0 голосов
/ 09 января 2019

Я пытаюсь запустить скрипт Powershell для Runbook в учетной записи автоматизации в Azure. Я использую функцию для передачи нескольких параметров. Runbook предназначен для восстановления дисков ВМ. Однако из структуры кода, которую я использую, не похоже, что я могу передать более 1 имени ресурса. Как мне реструктурировать этот код или как я формирую свою функцию или любую из строк в сценарии, чтобы передать более одного имени ресурса (в данном случае имена виртуальных машин)?

В настоящее время я могу передать только одно имя ресурса в функции, но мне нужно передать два имени виртуальной машины.

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. Как я могу пройти samplevm02? Учетная запись хранения остается прежней. Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 10 января 2019

Если вы хотите запустить powershell в powershell runbook, вы можете просто передать имена vm в виде строки и отделить их запятой, например, «vm1, vm2, vm3». Затем в коде Runbook разделите строку на массив, затем в цикле foreach работает с каждым vm.

Простой тест в runbook powershell:

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 {}
    }
0 голосов
/ 09 января 2019

Как прокомментировал Vesper , измените определение параметра, чтобы получить массив строк, и выполните цикл по этому массиву с помощью foreach{..}. Лично я бы немного расширил это, поместив параметры в блок Param(), чтобы создать «расширенную функцию». При этом функция автоматически получает дополнительные общие параметры PowerShell, такие как ErrorAction, Verbose и т. Д. Кроме того, я бы переименовал функцию, чтобы она соответствовала Verb-Noun соглашению об именах для функций PowerShell.

Примерно так:

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
...