PowerShell if/else语句似乎暂停

PowerShell if/else语句似乎暂停,powershell,if-statement,Powershell,If Statement,我有一个PowerShell脚本,它基本上是用于迁移数据的队列。基本上,该脚本将通过一个调查问卷,并根据调查问卷创建成批的命令。所有这些工作都很好,它正在执行我遇到问题的迁移 在本例中,我一次迁移9个LUN。一旦unix系统报告这9个LUN已完成(而不是正在进行零迁移),它将删除旧LUN并启动新的批处理,直到完成 以下是我认为我一直坚持的代码: function Execute_AddVdisk { $FileCount = 1 $vDiskNames = Get-Content

我有一个PowerShell脚本,它基本上是用于迁移数据的队列。基本上,该脚本将通过一个调查问卷,并根据调查问卷创建成批的命令。所有这些工作都很好,它正在执行我遇到问题的迁移

在本例中,我一次迁移9个LUN。一旦unix系统报告这9个LUN已完成(而不是正在进行零迁移),它将删除旧LUN并启动新的批处理,直到完成

以下是我认为我一直坚持的代码:

function Execute_AddVdisk {
    $FileCount = 1
    $vDiskNames = Get-Content $WorkingDir\vDiskNames.txt
    $date = Get-Date
    Write-Output "$date - vDisk copy starting..." | Out-File $WorkingDir\log.txt -Encoding Ascii -Append
    Write-Output "`n" | Out-File $WorkingDir\log.txt -Encoding ascii -Append
    Execute_AddVdisk-Continue
}

function Execute_AddVdisk-Continue {
    if (Test-Path $WorkingDir\migrate_vdisks-$FileCount.txt) {
        $date = Get-Date
        Write-Host "Adding vDisk copies. Executing file $WorkingDir\migrate_vdisks-$FileCount.txt"
        Write-Output "$date - Executing file $WorkingDir\migrate_vdisks-$FileCount.txt" | Out-File $WorkingDir\log.txt -Encoding Ascii -Append
        CMD.EXE /C "ssh user@$svc -i PathToKey -m $WorkingDir\migrate_vdisks-$FileCount.txt"
        Delete_vDisks
    } else {
        Write-Host "All migrations are complete. Exiting."
        Send-MailMessage -From "someone@somewhere.com" -To "someone@somewhere.com" -Subject "Something" -Body "Some Stuff" -Attachments "somelog" -SmtpServer somemailserver
        Set-Location C:\
        Remove-Item -Path $WorkingDir -Recurse
        exit
    }
}

function Delete_vDisks {
    $SessionCopies = @()
    $AllvDiskCopies = CMD.EXE /C "ssh user@$svc -i PathToKey lsvdisksyncprogress -delim ," | ConvertFrom-Csv
    if ($AllvDiskCopies -eq $null) {
        $date = Get-Date
        Write-Host "Deleting vDisk copies. Executing file $WorkingDir\Remove_vDiskCopies-$FileCount.txt"
        Write-Output "$date - Executing file $WorkingDir\Remove_vDiskCopies-$FileCount.txt" | Out-File $WorkingDir\log.txt -Encoding ascii -Append
        CMD.EXE /C "ssh user@$svc -i PathToKey -m $WorkingDir\Remove_vDiskCopies-$FileCount.txt"
        $FileCount++
        Execute_AddVdisk-Continue
    } else {
        foreach ($vDiskCopy in $AllvDiskCopies.vdisk_name) {
            $SessionCopies += $vDiskNames | Where-Object {$_ -like $vDiskCopy}
        }
        if ($SessionCopies -eq $null) {
            $date = Get-Date
            Write-Host "Deleting vDisk copies. Executing file $WorkingDir\Remove_vDiskCopies-$FileCount.txt"
            Write-Output "$date - Executing file $WorkingDir\Remove_vDiskCopies-$FileCount.txt" | Out-File $WorkingDir\log.txt -Encoding Ascii -Append
            CMD.EXE /C "ssh user@$svc -i PathToKey -m $WorkingDir\Remove_vDiskCopies-$FileCount.txt"
            $FileCount++
            Execute_AddVdisk-Continue
        } else {
            $date = Get-Date
            $SessionCopiesCount = $SessionCopies.Count
            Write-Host "$SessionCopiesCount copies are still being synched. Sleeping for 60 seconds and checking again..."
            Write-Output "$date - $SessionCopiesCount copies are still being synched. Sleeping for 60 seconds and checking again..." | Out-File $WorkingDir\log.txt -Encoding ascii -Append
            Start-Sleep -Seconds 60
            Delete_vDisks
        }
    }
}
以下是日志的截断版本:

04/05/2017 10:24:01 - Executing file C:\scripts\SVC_Data_Migrate\05Apr2017-1021\migrate_vdisks-1.txt 04/05/2017 10:24:08 - 9 copies are still being synched. Sleeping for 60 seconds and checking again... 04/05/2017 10:34:16 - 2 copies are still being synched. Sleeping for 60 seconds and checking again... 04/05/2017 10:35:17 - Executing file C:\scripts\SVC_Data_Migrate\05Apr2017-1021\Remove_vDiskCopies-1.txt 04/05/2017 10:35:21 - Executing file C:\scripts\SVC_Data_Migrate\05Apr2017-1021\migrate_vdisks-2.txt 04/05/2017 10:35:27 - 9 copies are still being synched. Sleeping for 60 seconds and checking again... 04/05/2017 11:43:26 - 1 copies are still being synched. Sleeping for 60 seconds and checking again... 04/05/2017 11:44:27 - Executing file C:\scripts\SVC_Data_Migrate\05Apr2017-1021\Remove_vDiskCopies-2.txt 04/05/2017 11:44:31 - Executing file C:\scripts\SVC_Data_Migrate\05Apr2017-1021\migrate_vdisks-3.txt 04/05/2017 11:44:40 - 9 copies are still being synched. Sleeping for 60 seconds and checking again... 04/05/2017 11:58:52 - 9 copies are still being synched. Sleeping for 60 seconds and checking again... 我也尝试过计数,因为它是一个数组,最后我得到了相同的结果

if ($AllvDiskCopies.Count -eq 0)

您提到这是一项计划任务。计划任务本身是否有时间和结束时间?顺便说一句,不需要在代码中分散使用
cmd/c
。您可以只放置要运行的命令行。(毕竟PowerShell是一个shell。它可以运行命令。)@JackChance这主意不错,但它没有结束日期。实际上,我也没有选中“如果任务运行时间超过”复选框。如果在脚本似乎已停止时查看任务,则任务本身只是处于“正在运行”状态。
if ($AllvDiskCopies.Count -eq 0)