У меня есть форма Windows, созданная в PowerShell ISE, используемая для выполнения робокопирования с помощью кнопки. Он работает нормально, но интерфейс зависает, когда выполняется robocopy, что я считаю нормальным поведением; кое-что о задачах, выполняемых в одном потоке. Я хочу иметь возможность остановить этот процесс robocopy во время его работы , мне нужна помощь, как это сделать.
Я создал кнопку и функцию для этого, мне просто нужно помощь в том, что делать в функции (и в другом месте, если необходимо). Я видел, как кто-то делал это, но, похоже, у меня это не работает; он выводит «Robocopy has terminated», как и предполагалось, но продолжает работать с файлами:
function start_robocopy {
robocopy "$($InputSource.Text)" "$($InputDestination.Text)" /ndl /e /np /tee /L | ForEach-Object {
[void] [System.Windows.Forms.Application]::DoEvents() }
}
function stop_robocopy {
if (Get-Process -Name robocopy -ErrorAction SilentlyContinue) {Stop-Process -Name robocopy -Force
$outputBox.AppendText("Robocopy has been terminated.")}
Здесь мой полный код; см. шаблон функции, созданный внизу:
Add-Type -AssemblyName System.Windows.Forms
[System.Windows.Forms.Application]::EnableVisualStyles()
$form = New-Object System.Windows.Forms.Form
$form.Size = New-Object System.Drawing.Size(850,582)
$form.add_Load($FormEvent_Load)
$outputBox = New-Object System.Windows.Forms.TextBox
$outputBox.Location = New-Object System.Drawing.Size(200,110)
$outputBox.Size = New-Object System.Drawing.Size(620,420)
$outputBox.MultiLine = $True
$outputBox.ScrollBars = "Both"
$outputBox.BackColor = "White"
$outputBox.ReadOnly = $True
$Form.Controls.Add($outputBox)
#-----FORM END-----#
#-----BUTTONS START-----#
$StartBtn = New-Object System.Windows.Forms.Button
$StartBtn.Location = New-Object System.Drawing.Size(10,80)
$StartBtn.Size = New-Object System.Drawing.Size(180,35)
$StartBtn.Text = "Start Robocopy"
$StartBtn.Add_Click({start_robocopy})
$form.Controls.Add($StartBtn)
$StopBtn = New-Object System.Windows.Forms.Button
$StopBtn.Location = New-Object System.Drawing.Size(10,150)
$StopBtn.Size = New-Object System.Drawing.Size(180,35)
$StopBtn.Text = "Stop Robocopy"
$StopBtn.Add_Click({stop_robocopy})
$form.Controls.Add($StopBtn)
#-----BUTTONS END-----#
#-----INPUTBOXES START-----#
$InputSource = New-Object System.Windows.Forms.TextBox
$InputSource.Text="C:\test\src"
$InputSource.Location = New-Object System.Drawing.Size(10,15)
$InputSource.Size = New-Object System.Drawing.Size(140,20)
$form.Controls.Add($InputSource)
$InputDestination = New-Object System.Windows.Forms.TextBox
$InputDestination.Text="C:\test\dst"
$InputDestination.Location = New-Object System.Drawing.Size(10,40)
$InputDestination.Size = New-Object System.Drawing.Size(140,20)
$form.Controls.Add($InputDestination)
#-----INPUTBOXES END-----#
#-----FUNCTIONS START-----#
function start_robocopy {
robocopy "$($InputSource.Text)" "$($InputDestination.Text)" /ndl /e /np /tee /L | ForEach-Object { $outputBox.AppendText($_ + "`r`n") }
}
function stop_robocopy {
#WHAT TO DO HERE?
}
#-----FUNCTIONS END-----#
$form.ShowDialog()