winforms - Powershell ISE 表单:如何使用功能停止 Robocopy?
问题描述
我在 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()
解决方案
您可以使用 PowerShell 后台作业,以便您可以控制它并且它不会挂起 UI。
使用 Start-Job 并捕获 jobId,然后使用相同的 jobId 停止 stop_robocopy 中的作业。
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)"
}
推荐阅读
- c#-4.0 - 对象到带有列表和字典的元组 c#
- jquery - 使用对象 jquery 或 javascript 内连接两个数组
- python - Pandas - read_sql_query 填充列名
- javascript - 如何使用javascript根据其值更改数字的颜色并做出反应?
- html - 将超大图像放入父容器中
- flutter - 输入'未来
' 不是类型 'Future 的子类型 ' - python - Statsmodels ACF置信区间不匹配 - Python
- spring-boot - Spring Batch 为特定作业禁用 Spring Boot AutoConfiguration
- r - 用文件名中的参数在R中编写一个csv文件
- ruby - 根据 Ruby Selenium 中的搜索关键字打印搜索结果