Этот первый ответ был правильным, создайте форму в главном потоке и выполните долгосрочное задание в отдельном потоке. Причина, по которой он не выполняет основной код до тех пор, пока форма не будет закрыта, заключается в том, что вы используете метод '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
}
}