我试图在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?存储帐户保持不变。提前致谢。
答案 0 :(得分:0)
如Vesper所述,更改参数定义以接收字符串数组,并使用foreach{..}
遍历该数组。
就我个人而言,我可以通过将参数放在Param()
块中来创建一个“高级函数”,从而对此进行一些扩展。这样,该函数会自动获得额外的常用PowerShell参数,例如ErrorAction
,Verbose
等。
另外,我将重命名该函数,使其符合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
传递参数并运行:
对于您的代码,您可以按照上述步骤进行操作,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 {}
}