Уволить форму PowerShell, контролируемой задачей начальной работы
-
12-11-2019 - |
Вопрос
Мне было поручено создать скрипт PowerShell с GUI, который позволяет пользователям устанавливать сетевые принтеры.Я успешно удалось сделать это, но я не могу удовлетворить требование, чтобы пользователь был показан «Пожалуйста, подождите» окно, в то время как принтеры устанавливают.Если я переключаюсь в окно из главной нити, Gui висит.Если я перехожу показывать окно на отдельной работе, я никогда не смогу закрою окно снова.Вот моя попытка:
$waitForm = New-Object 'System.Windows.Forms.Form'
$CloseButton_Click={
# open "please wait form"
Start-Job -Name waitJob -ScriptBlock $callWork -ArgumentList $waitForm
#perform long-running (duration unknown) task of adding several network printers here
$max = 5
foreach ($i in $(1..$max)){
sleep 1 # lock up the thread for a second at a time
}
# close the wait form - doesn't work. neither does remove-job
$waitForm.Close()
Remove-Job -Name waitJob -Force
}
$callWork ={
param $waitForm
[void][reflection.assembly]::Load("System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089")
$waitForm = New-Object 'System.Windows.Forms.Form'
$labelInstallingPrintersPl = New-Object 'System.Windows.Forms.Label'
$waitForm.Controls.Add($labelInstallingPrintersPl)
$waitForm.ClientSize = '502, 103'
$labelInstallingPrintersPl.Location = '25, 28'
$labelInstallingPrintersPl.Text = "Installing printers - please wait..."
$waitForm.ShowDialog($this)
}
.
Кто-нибудь знает, как я могу отбросить окно queptform, когда длительная задача заключила?
Решение
Вы можете попытаться запустить диалоговое окно Windows Forms на главной ните и выполнять фактическую работу в фоновом задании:
Add-Type -Assembly System.Windows.Forms
$waitForm = New-Object 'System.Windows.Forms.Form'
$labelInstallingPrintersPl = New-Object 'System.Windows.Forms.Label'
$waitForm.Controls.Add($labelInstallingPrintersPl)
$waitForm.ClientSize = '502, 103'
$labelInstallingPrintersPl.Location = '25, 28'
$labelInstallingPrintersPl.Text = "Installing printers - please wait..."
$waitForm.ShowDialog($this)
Start-Job -ScriptBlock $addPrinters | Wait-Job
$waitForm.Close()
$addPrinters = {
$max = 5
foreach ($i in $(1..$max)) {
sleep 1 # lock up the thread for a second at a time
}
}
. Другие советы
Этот первый ответ был правильным, создайте форму на главной ните и выполните длинную рабочую задачу в отдельном потоке.Причина, по которой она не выполняется основной код до тех пор, пока после того, как форма не будет отклонена, заключается в том, что вы используете метод «ShowDialog» формы, этот метод попадает в последующее выполнение кода, пока форма не будет закрыта. Вместо этого используйте метод «Show», выполнение кода будет продолжаться, вы, вероятно, должны включать некоторые обработчики событий для распоряжения формы
Add-Type -Assembly System.Windows.Forms
$waitForm = New-Object 'System.Windows.Forms.Form'
$labelInstallingPrintersPl = New-Object 'System.Windows.Forms.Label'
$waitForm.Controls.Add($labelInstallingPrintersPl)
$waitForm.ClientSize = '502, 103'
$labelInstallingPrintersPl.Location = '25, 28'
$labelInstallingPrintersPl.Text = "Installing printers - please wait..."
$waitForm.Add_FormClosed({
$labelInstallingPrintersPl.Dispose()
$waitForm.Dispose()
})
$waitForm.Show($this)
Start-Job -ScriptBlock $addPrinters | Wait-Job
$waitForm.Close()
$addPrinters = {
$max = 5
foreach ($i in $(1..$max)) {
sleep 1 # lock up the thread for a second at a time
}
}
.