gpt4 book ai didi

powershell - 打破 Azure 工作流 Runbook 中的 ForEach 循环

转载 作者:行者123 更新时间:2023-12-03 03:15:42 25 4
gpt4 key购买 nike

如何在 Azure 自动化的 PowerShell 工作流中中断 ForEach 循环?

其他信息:

我在 Azure 自动化中有一个 VM 恢复 Runbook,它循环访问附加的数据磁盘。每个 VHD 的 blobcopy 备份的名称正在使用阵列输入到 Runbook 中,并与当前要恢复的数据磁盘相匹配。

备份名称采用以下格式:MM-DD-YYYY--BlobName.vhd

示例:

数据盘名称:TestDisk-1.vhd

备份名称:12-22-2014--TestDisk-1.vhd

对于每个数据磁盘,都会运行这段代码:

$dataDisksRestored = 0
ForEach ( $vmDataDisk in $vmDataDisks ) {
$vmDataDiskName = $vmDataDisk.DiskName
$vmDataDiskuris = $vmDataDisk.MediaLink
$vmDataBlobName = $vmDataDiskuris.Segments[-1]
$vmDataOrigContainerName = $vmDataDiskuris.Segments[-2].Split('/')[0]
$attached = $false
While ($attached -eq $False) {
if ((Get-AzureDisk -DiskName $vmDataDiskName).AttachedTo) {
Write-Output "Sleeping for 5"
Start-Sleep 5
} else {
$attached = $true
}
}
$dataDiskBlobBackupName = $null
ForEach ($backupName in $vmDataDisksBackupNames) {
$b = $backupName.Split('-')[-1]
Write-Output $b
Write-Output $vmDataBlobName
if ($b.CompareTo($vmDataBlobName) -eq 0) {
$dataDiskBlobBackupName = $backupName
break # <- *** Break here if the names match ***
}
}
#Remove-AzureDisk -DiskName $vmDataDiskName –DeleteVHD
#Start-AzureStorageBlobCopy -SrcContainer $backupContainerName -SrcBlob $dataDiskBlobBackupName -DestContainer $vmDataOrigContainerName -DestBlob $vmDataBlobName –Force
#Get-AzureStorageBlobCopyState -Container $vmDataOrigContainerName -Blob $vmDataBlobName –WaitForComplete
#Add-AzureDisk -DiskName $vmDataDiskName -MediaLocation $vmDataDiskuris.AbsoluteUri
$dataDisksRestored++
}

我得到的错误是:

Runbook definition is invalid. Break and Continue statements are not supported in a Windows
PowerShell Workflow. Instead, use an 'if' statement to control loop execution.

我认为添加一个检查来查看 $dataDiskBlobBackupName 是否仍然为 null 将阻止代码块的其余部分运行,但它仍然会循环遍历数组的其余部分。有没有更简单的方法来打破循环?

最佳答案

TechNet dosent确实给出了如何解决这个问题的任何建议。仅声明:

Break and Continue statements are not valid in workflows. Instead, use an If statement to control loop execution.

不太了解工作流程,但如何在 while 循环中使用 bool 标志。使用 $index 循环遍历数组,并使用 If 设置 $flag

$flag = $false
$index = 0
$max = $vmDataDisksBackupNames.Count - 1
# Run through the loop until $flag is true or we hit the end of the array.
While($flag -eq $false -or ($index -le $max)){
$b = $vmDataDisksBackupNames[$index].Split('-')[-1]
Write-Output $b
Write-Output $vmDataBlobName
if ($b.CompareTo($vmDataBlobName) -eq 0) {
$dataDiskBlobBackupName = $vmDataDisksBackupNames[$index]
# Found a match. Flip the flag to exit the loop
$flag = $true
}
$index++
}

谨慎测试,因为我没有使用此逻辑的环境。另外,更了解您需求的人也可能会有所帮助。

关于powershell - 打破 Azure 工作流 Runbook 中的 ForEach 循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27606835/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com