Powershell ISE形式。如何停止Robocopy的功能?

问题描述 投票:1回答:1

我有一个在PowerShell ISE中创建的Windows窗体,用来通过一个按钮执行robocopy.它工作得很好,但是当robocopy正在进行时,界面挂起,我相信这是正常的行为;一些关于在同一线程中运行的任务。我希望能够在robocopy进程运行时停止它。我需要一些帮助,如何做到这一点,我创建了一个按钮和函数,我只是需要帮助,在函数中做什么(如果需要的话,在其他地方)。

我创建了一个按钮和函数来做这件事,我只是需要帮助在函数中做什么(如果需要的话,在其他地方).我看到有人这样做,但它似乎对我不起作用;它输出 "Robocopy已被终止",就像它应该做的那样,但继续通过文件运行。

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()
winforms function powershell robocopy
1个回答
0
投票

你可以使用PowerShell后台作业,这样你就可以控制它,而且不会挂住界面。

使用Start-Job并捕获jobId,然后在stop_robocopy中使用相同的jobId来停止该作业。

function start_robocopy {
    $source = Write-Host $InputSource.Text;
    $destination = Write-Host $InputDestination.Text;
    $jobId = Invoke-Command -ScriptBlock {Start-Job -ScriptBlock { robocopy "$source" "$destination" /ndl /e /np /tee /L | ForEach-Object { $outputBox.AppendText($_ + "`r`n") } }}
    $global:newJobId = $jobId.Id
}

function stop_robocopy {
    $jobId = Get-Job -Id $newJobId;
    Invoke-Command -ScriptBlock { Stop-job -Id $jobId.Id }
    Write-Host "Stopped: $($jobId.Id)"
}
© www.soinside.com 2019 - 2024. All rights reserved.