Member 14156312 Ответов: 1

Как закрыть графический интерфейс формы после проверки существующего файла в powershell?


Я хочу проверить существующий файл, если процесс все еще ждет файл, он отобразит окно графического интерфейса. После того, как файл будет существовать, окно автоматически закроется.

Я попробовал этот код, окно не может закрыться, даже файл уже существует.

Что я уже пробовал:

Checking the file:

$SN = "708TSTA"
$MAC = "2E5961370"

function Find {
    $n = 0
    while (-not (Get-ChildItem -Name "D:\SERVER\" | Where-Object {$_ -like "*$SN-$MAC*"})) {
        Start-Sleep -s 1
        D:\Auto\GUI.ps1
        $n++
        (Get-ChildItem -Name "D:\SERVER\" | Where-Object {$_ -like "*$SN-$MAC*"})
        Write-Host "Attempt no $n"
    }

    Write-Host ">>Flag found after $n attempts"
    return $true
}

if (Find) {
    Write-Host "Found"
}


GUI.ps1:

Add-Type -AssemblyName System.Windows.Forms
[System.Windows.Forms.Application]::EnableVisualStyles()

$Form                 = New-Object System.Windows.Forms.Form
$Form.ClientSize      = '578,400'
$Form.Text            = "Form"
$Form.BackColor       = "#c1daf7"
$Form.WindowState     = 'Maximized'
$Form.FormBorderStyle = "FixedDialog"

$Label1               = New-Object System.Windows.Forms.Label
$Label1.Text          = "UNDER PROCESS"
$Label1.AutoSize      = $true
$Label1.Width         = 25
$Label1.Height        = 10
$Label1.Location      = New-Object System.Drawing.Point(600,300)
$Label1.Font          = 'Microsoft Sans Serif,30,style=Bold,Underline'
$Label1.ForeColor     = "#d0021b"

$Label2               = New-Object System.Windows.Forms.Label
$Label2.Text          = "WAITING"
$Label2.AutoSize      = $true
$Label2.Width         = 25
$Label2.Height        = 10
$Label2.Location      = New-Object System.Drawing.Point(770,500)
$Label2.Font          = 'Microsoft Sans Serif,20,style=Bold'
$Label2.ForeColor     = "#fb0505"

$Check = Get-ChildItem -Name "D:\SERVER\" | Where-Object {$_ -like "*$SN-$MAC*"}
if($Check) {
    Write-Host "File Exist"
    $Form.Close()
}

$Form.Controls.AddRange(@($Label1,$Label2))
[void]$Form.ShowDialog()

1 Ответов

Рейтинг:
2

Richard Deeming

ShowDialog ждет, пока закроется окно. Ваш скрипт не будет продолжать работать до тех пор, пока пользователь не закроет окно вручную.

Вам нужно использовать Show вместо. Вам нужно будет сохранить ссылку на форму в переменной, чтобы вы могли закрыть ее, когда файл будет найден. Это будет проще сделать, если вы сохраните свой сценарий в одном файле.

Например:

function CreateForm {
    Add-Type -AssemblyName System.Windows.Forms
    [System.Windows.Forms.Application]::EnableVisualStyles()
    
    $Form                 = New-Object System.Windows.Forms.Form
    $Form.ClientSize      = '578,400'
    $Form.Text            = "Form"
    $Form.BackColor       = "#c1daf7"
    $Form.WindowState     = 'Maximized'
    $Form.FormBorderStyle = "FixedDialog"

    $Label1               = New-Object System.Windows.Forms.Label
    $Label1.Text          = "UNDER PROCESS"
    $Label1.AutoSize      = $true
    $Label1.Width         = 25
    $Label1.Height        = 10
    $Label1.Location      = New-Object System.Drawing.Point(600,300)
    $Label1.Font          = 'Microsoft Sans Serif,30,style=Bold,Underline'
    $Label1.ForeColor     = "#d0021b"

    $Label2               = New-Object System.Windows.Forms.Label
    $Label2.Text          = "WAITING"
    $Label2.AutoSize      = $true
    $Label2.Width         = 25
    $Label2.Height        = 10
    $Label2.Location      = New-Object System.Drawing.Point(770,500)
    $Label2.Font          = 'Microsoft Sans Serif,20,style=Bold'
    $Label2.ForeColor     = "#fb0505"

    $Form.Controls.AddRange(@($Label1,$Label2))
    return $Form
}

function Find($folder, $pattern) {
    $n = 0
    $form = $null
    while (-not (Get-ChildItem -Name $folder | Where-Object {$_ -like $pattern})) {
        if ($form -eq $null) {
            $form = CreateForm
            $form.Show()
        }
        
        Start-Sleep -s 1
        $n++
        
        Write-Host "Attempt no $n"
    }
    
    if ($form -ne $null) {
        $form.Close()
        $form.Dispose()
    }
    
    Write-Host ">>Flag found after $n attempts"
    return $true
}

$SN = "708TSTA"
$MAC = "2E5961370"
$folder = "D:\SERVER\"
$pattern = "*$SN-$MAC*"

if (Find $folder $pattern) {
    Write-Host "Found"
}

Метод Form.ShowDialog (System.Окна.Формы) | Microsoft Docs[^]
Метод Form.Show(IWin32Window) (System.Окна.Формы) | Microsoft Docs[^]