2014-05-16 62 views
0

我正在處理的腳本的一部分採用指定的用戶名,爲類似用戶名的計算機搜索活動目錄,對它們進行ping操作,然後將聯機計算機添加到數組中稍後再使用。我想添加一個進度條到腳本的ping部分,但我遇到了問題。如果我在ping循環之前調用它,我必須提供進度條的表格凍結腳本的執行。Powershell GUI,進度條和哈希表

下面是進度條(非常基本的)代碼:

#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)。然而,我沒有運氣讓它工作,甚至沒有讓另一個線程啓動。我怎樣才能得到這個進度條和表單以及它在另一個線程中運行?

回答

0

爲什麼不直接使用內置UI報告PowerShell中的進度?這是一個行調用Write-Progress例如爲:

$computers = 1..10 | % {"server$_"} 
$numComputers = $computers.Length 
for ($ndx = 0; $ndx -le $numComputers; $ndx++) { 
    $computer = $computers[$ndx].Trim() 
    Write-Progress "Testing connection to $computer" -PercentComplete ($ndx/$numComputers * 100) 
    #if (Test-Connection $computer -Count 1) { 
    # $arrayComputers.add($computer) | Out-Null 
    #} 
    Start-Sleep -Seconds 1 
} 

BTW以上你的方法的主要問題是ShowDialog()方法調用不返回,直到窗體關閉。如果你想使用ShowDialog(),你必須在表單中的一個事件處理器的上下文中執行你的邏輯(加載/激活)。另一種選擇是使用Show(),但這意味着您必須使用Application.DoEvents()在循環中抽取消息,以便表單有機會更新自身。

+0

哇,很簡單,謝謝。看起來我的櫃檯沒有正確遞增,但我想我可以解決這個問題。我不寫給控制檯的原因只是爲了讓事情看起來更好。整個過程將通過GUI完成,而不是控制檯。 – user3645184

+0

如果您不使用counter/ndx遞增的'for'循環,那麼請謹慎使用'$ counter ++',因爲它不會「輸出」結果。爲了獲得增量和輸出,使用'($ counter ++)'。 –