2014-12-22 5 views
1

Azure 자동화의 PowerShell 워크 플로에서 ForEach 루프를 중단하려면 어떻게합니까?Azure 워크 플로에서 ForEach 루프 깨기

추가 정보 :

나는 첨부 된 데이터 디스크를 통해 루프 푸른 자동화에서 VM 복구 runbook 있습니다. 각 VHD의 blobcopy 백업의 이름은 배열을 사용하여 runbook에 입력되고 복원 할 현재 데이터 디스크와 일치됩니다.

백업의 이름은 다음 형식으로되어 있습니다 : MM-DD-YYYY - BlobName.vhd

예 :

데이터 디스크 이름 : TestDisk는-1.vhd

백업 이름 : 12

$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++ 
} 
: - -22-2014 TestDisk는-1.vhd

각 데이터 디스크 코드의이 작품에 대한이 실행되고 0

이해가 오류가 있습니다 : 나는 $ dataDiskBlobBackupName가 실행 코드 블록의 나머지 부분을 방지 할 수 있습니다 여전히 null의 경우 확인하기 위해 검사를 추가 생각

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. 

하지만 것이다 배열의 나머지 부분을 통해 여전히 루프 . 루프를 깨는 더 쉬운 방법이 있습니까?

답변

1

TechNet dosent는 실제로이 문제를 해결하는 방법에 대한 제안 사항을 제공합니다. 단지 다음과 같이 명시되어 있습니다.

중단 및 계속 명령문은 워크 플로우에서 유효하지 않습니다. 대신 If 문을 사용하여 루프 실행을 제어하십시오.

작업 흐름에 대해서는 잘 모르지만 while 루프 내에서 부울 플래그를 사용하는 방법은 무엇입니까? $index와 배열을 통해 루프와 내가에이 논리를 사용할 수있는 환경을 가지고 있지 않기 때문에주의으로 $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++ 
} 

테스트를 설정 If를 사용합니다. 또한 귀하의 필요 사항을 더 잘 이해하는 사람도 도움이 될 수 있습니다.

+0

은 저에게 도움이됩니다. 도움을 주셔서 감사합니다. Matt. while 루프는 $ flag와는 작동하지 않았으므로 조정되었습니다. ($ flag -eq $ false -and ($ index -le $ max)) – Ahmad

+0

저는 Azure Automation 서비스에서 일하고 있습니다. 네,이게 제가하는 제안입니다. 루프 내에있는 다른 모든 로직 주위에 if 문 "if ($ flag -eq $ false)"를 배치하여 처음에는 각 루프에 대해 비슷한 것을 사용할 수도 있습니다. – Joe