Powershell 后台工作人员延迟执行';妇女嫁妆活动
我正在努力解决PowerShell 4.0脚本中的一个问题。我使用windows窗体名称空间构建了一个用户界面,但需要进行一些耗时的处理,这就是为什么我采用了Powershell 后台工作人员延迟执行';妇女嫁妆活动,powershell,backgroundworker,powershell-4.0,Powershell,Backgroundworker,Powershell 4.0,我正在努力解决PowerShell 4.0脚本中的一个问题。我使用windows窗体名称空间构建了一个用户界面,但需要进行一些耗时的处理,这就是为什么我采用了BackgroundWorker来保持GUI的响应性 一旦开始,我就使用$Worker.Add\u DoWork({})方法添加事件订阅,但这不起作用。这就是为什么我使用了Register ObjectEvent。现在,我的DoWork事件只在我关闭表单后执行,我不明白为什么会发生这种情况。我的代码如下,有人能帮我解决这个问题吗 #Crea
BackgroundWorker
来保持GUI的响应性
一旦开始,我就使用$Worker.Add\u DoWork({})
方法添加事件订阅,但这不起作用。这就是为什么我使用了Register ObjectEvent
。现在,我的DoWork
事件只在我关闭表单后执行,我不明白为什么会发生这种情况。我的代码如下,有人能帮我解决这个问题吗
#Create worker object
$Worker = new-object System.ComponentModel.BackgroundWorker;
$Worker.WorkerReportsProgress = $true;
#Handles $Worker.ReportProgress event
$ReportProgress = {$Progressbar.PerformStep()};
#Handles $Worker.DoWork event
$DoWork = { write-host("do work event fired")};
#Add eventhandlers
Register-ObjectEvent -InputObject $Worker -EventName DoWork -Action $DoWork ;
Register-ObjectEvent -InputObject $Worker -EventName ProgressChanged -Action $ReportProgress;
如果在脚本中调用
$Worker.RunWorkerAsync()
方法,则不会生成任何输出。如果我关闭名为$Worker.RunWorkerAsync()
方法的表单,文本“Do work event fired”将输出到PowerShell控制台 为了回答我自己的问题,下面是更新progressbar的文件复制示例。复制文件方法取自stej在线程中给出的示例,我根据自己的需要修改了该示例。只需在主脚本中侦听来自后台作业的事件
#Register event
Register-EngineEvent -SourceIdentifier Progress -Action {
$Progressbar.Value = $event.MessageData;
$StatusText.Text = "Copying VHD File - " + $event.MessageData + " % complete";
$Form.Refresh();} >null
#Create worker and perform the work
$worker = start-job -name "Work" -scriptblock {
Register-EngineEvent -SourceIdentifier Progress -Forward;
function Copy-File
{
param( [string]$from, [string]$to)
$ffile = [io.file]::OpenRead($from)
$tofile = [io.file]::OpenWrite($to)
try {
[byte[]]$buff = new-object byte[] 4096 #(4096*1024)
[long]$total = [long]$count = 0
do {
$count = $ffile.Read($buff, 0, $buff.Length)
$tofile.Write($buff, 0, $count)
$total += $count
[int]$pctcomp = ([int]($total/$ffile.Length* 100));
if ($total % 1mb -eq 0) {
New-Event -SourceIdentifier Progress -MessageData $pctcomp;
}
} while ($count -gt 0)
}
finally {
$ffile.Close();
$tofile.Close();
}
}
Copy-File -from ("F:\HIS0402_C.wim") -to ("X:\JT\HIS0164.vhd");
};