Уволить форму PowerShell, контролируемой задачей начальной работы

StackOverflow https://stackoverflow.com/questions/9427391

Вопрос

Мне было поручено создать скрипт 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
    }
}
.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top