PS表单-在ForEach循环中使用BREAK的未处理异常

时间:2019-01-23 16:39:59

标签: powershell

从上一个问题开始 实际的代码要复杂得多,但是以下是我的循环的有效示例:

Add-Type -AssemblyName System.Windows.Forms
$source = '\\servera\files'
$destination = '\\server b\files'
$form = New-Object System.Windows.Forms.Form

$CopyOutput = New-Object System.Windows.Forms.Label
$CopyOutput.Location = '10,15'
$CopyOutput.Size = '350,20'

$form.Text = "$DomainName Folder/Archive Copy"
$form.Size = '380,130'
$form.CancelButton = $ExitButton
$form.Add_FormClosing({
    $script:CancelLoop = $true
}) 

$StartButton = New-Object System.Windows.Forms.Button
$StartButton.Name = 'StartButton'
$StartButton.Location = '10,50'
$StartButton.Size = '75,23'
$StartButton.Text = 'Start Copy'
$StartButton.Enabled = $true

$PauseButton = New-Object System.Windows.Forms.Button
$PauseButton.Location = '100,50'
$PauseButton.Size = '75,23'
$PauseButton.Text = 'Pause Copy'
$PauseButton.Enabled = $true

$StopButton = New-Object System.Windows.Forms.Button
$StopButton.Location = '190,50'
$StopButton.Size = '75,23'
$StopButton.Text = 'Stop Copy'
$StopButton.Enabled = $true

$ExitButton = New-Object System.Windows.Forms.Button
$ExitButton.Name = 'ExitButton'
$ExitButton.Location = '280,50'
$ExitButton.Size = '75,23'
$ExitButton.Text = 'Exit'
$ExitButton.DialogResult = [System.Windows.Forms.DialogResult]::Cancel
$form.Controls.AddRange(@($StartButton,$PauseButton,$StopButton,$ExitButton,$CopyOutput))

$StopButton.Add_Click({
    $script:PauseToggle = $false
    $script:CancelLoop = $true
})
$PauseButton.Add_Click({
# Boolean change value to true/false
    $script:PauseToggle = !$script:PauseToggle
})

$StartButton.Add_Click({
    $script:CancelLoop = $false
    $script:PauseToggle = $false
    $StopButton.Enabled = $true
    $StartButton.Enabled = $false

Get-ChildItem -LiteralPath $Source -Recurse -File | ForEach {
    Copy-Item -LiteralPath $_.FullName -Destination $Destination
    $CopyOutput.Text = ('Copying' + $_.FullName)
    [System.Windows.Forms.Application]::DoEvents()
    If($script:CancelLoop -eq $true) {
        $CopyOutput.Text = 'Cancel copy'
        #Exit the loop
        Break;
    }
    If ($script:PauseToggle) {
        $CopyOutput.Text = 'Paused'
        Do { 
        [System.Windows.Forms.Application]::DoEvents()
        } Until (!$script:PauseToggle)
    }
}
$CancelButton.Enabled = $false
$StartCopyButton.Enabled = $true
})
$form.ShowDialog() 
$form.Dispose()

我能找到的所有文章都说此代码应该可以正常工作-有人可以建议如何避免按下“停止”按钮时导致的未处理异常吗?

我能找到的所有文章都说此代码应该可以正常工作-有人可以建议如何避免按下“停止”按钮时导致的未处理异常吗?

1 个答案:

答案 0 :(得分:0)

从我的研究中可以看出,这是在表单中使用BREAK的问题。不过,我确实从here

找到了一种解决方法

使用此Commandlet将停止当前管道,而不是使用BREAK

Filter Stop-Pipeline {
    $sp = { Select-Object -First 1 }.GetSteppablePipeline($MyInvocation.CommandOrigin)
    $sp.Begin($true)
    $sp.Process(0)
}
相关问题