【发布时间】:2014-07-05 04:12:06
【问题描述】:
我正在处理的部分脚本采用指定的用户名,在活动目录中搜索以该用户名命名的计算机,对它们执行 ping 操作,然后将在线计算机添加到阵列中以供以后使用。我想在脚本的 ping 部分添加一个进度条,但我遇到了问题。如果我在 ping 循环之前调用它,我必须呈现进度条的表单会冻结脚本的执行。
这是进度条的代码(非常基本):
#Progress Bar
$objFormPBar = New-Object System.Windows.Forms.Form
$objFormPBar.Text = "Loading"
$objFormPBar.Size = New-Object System.Drawing.Size(200,100)
$objFormPBar.StartPosition = "CenterScreen"
$objFormPBar.Topmost = $True
$objFormPBar.Icon = $Icon
$progressBar = New-Object System.Windows.Forms.ProgressBar
$progressBar.Size = New-Object System.Drawing.Size(175,20)
$progressBar.Location = New-Object System.Drawing.Size(5, 20)
$progressBar.Minimum = 0
$progressBar.Maximum = 0
$objFormPBar.Controls.Add($progressBar)
这是我试图显示它的地方,这样会暂停脚本的执行(从点击处理函数内部调用,因此是全局变量):
$global:progressBar.Maximum = $computers.count
$global:objFormPBar.Add_Shown({$objFormPBar.Activate()})
[void] $global:objFormPBar.ShowDialog()
Foreach ($computer in $computers) {
$computer = $computer.trim()
If(Test-Connection $computer -Count 1) {
$arrayComputers.add($computer) | Out-Null
}
$global:progressBar.Increment(1)
}
$global:objFormPBar.Close()
查看问题,我发现您可以在单独的线程中运行进度条并在两者之间传递变量(请参阅:Marquee Progress Bar freezes in Powershell)。但是,我没有运气让它工作,甚至没有启动另一个线程。我怎样才能让这个进度条和表单一起在另一个线程中运行?
【问题讨论】: