2017-06-02 4 views
0

Je suis nouveau à Powershell et je suis confronté à ce problème. J'ai un très long script d'installation automatisé qui fonctionne à travers l'installation MySQL/compte et d'autres .msi. Pendant que les utilisateurs attendent que le script se termine, j'ai l'affichage de l'invite "Please Wait" qui contient un pinwheel tournant .gif dans la zone d'image. Le problème est que si je mets la forme.visible à $ true et que je la ferme plus tard dans le script, alors le .gif lui-même ne bougera pas. Il affiche mais perd son animation. Si je change le form.visible en "false" et change le formulaire en modal en ajoutant un paramètre form.showdialog(), l'animation est parfaite dans le fichier .gif mais le script s'arrête et ne peut progresser qu'après la fermeture de la fenêtre. Y at-il un moyen pour le script de progresser sans perdre l'animation dans le fichier .gif? S'il vous plaît aider. J'ai trouvé très peu de forums sur powershell et .gif pour une raison quelconque. Voici le code pour le formulaire.Importer un fichier .gif animé dans Windows.Forms dans Powershell

$Form = New-Object system.Windows.Forms.Form 
$Form.Location= New-Object System.Drawing.Size(100,100) 
$Form.Size= New-Object System.Drawing.Size(550,170) 
$Form.StartPosition = "Manual" 
$Form.Visible=$true 
$Form.Enabled = $true 


[reflection.assembly]::LoadWithPartialName("System.Windows.Forms") 
$file = (get-item 'PathToMyGifFile') 
$img = [System.Drawing.Image]::Fromfile($file); 

[System.Windows.Forms.Application]::EnableVisualStyles(); 

$pictureBox = new-object Windows.Forms.PictureBox 
$pictureBox.Location = New-Object System.Drawing.Size(0,1) 
$pictureBox.Size = New-Object System.Drawing.Size(100,80) 
$pictureBox.Image = $img 
$Form.controls.add($pictureBox) 

$Label1 = New-Object System.Windows.Forms.Label 
$Label1.Text = "Please wait for Installation to complete" 
$Label1.Location= New-Object System.Drawing.Size(110,35) 
$Label1.Size = New-Object System.Drawing.Size(400,25) 
$Label1Font = New-Object System.Drawing.Font("Tahoma",10, 
[System.Drawing.FontStyle]::Bold) 

$Label1.Font = $Label1Font 
$Label1.BackColor = "white" 
$Form.Controls.Add($Label1) 

$Label2 = New-Object System.Windows.Forms.Label 
$Label2.Text = "This may take several minutes . . ." 
$Label2.Location= New-Object System.Drawing.Size(120,60) 
$Label2.Size = New-Object System.Drawing.Size(370,75) 
$Label2Font = New-Object System.Drawing.Font("Tahoma",10, 
[System.Drawing.FontStyle]::Regular) 

$Label2.Font = $Label2Font 
$Label2.BackColor = "white" 
$Form.Controls.Add($Label2) 

$BackDrop = New-Object System.Windows.Forms.Label 
$BackDrop.Location = New-Object System.Drawing.Size(0,0) 
$BackDrop.Size = New-Object System.Drawing.Size(550,150) 
$BackDrop.BorderStyle = [System.Windows.Forms.BorderStyle]::FixedSingle; 
$BackDrop.BackColor = [System.Drawing.Color]::White 

$Form.Controls.Add($WaitBackGroundBox) 
$Form.Topmost = $True 
[void] $Form.ShowDialog() # If absent, animation is lost. If present 
          # (combined with form.visible = $false), script 
          # halts until the form itself is closed. 

Répondre

0

J'ai trouvé un fil avec une solution de contournement pour ce qui crée une nouvelle instance d'exécution et ouvre le formulaire en son sein. De cette façon, le fichier .gif s'exécute normalement et vous pouvez exécuter la commande form.close() chaque fois que vous le souhaitez dans votre code. Cela serait utile au cas où quelqu'un voudrait utiliser un .gif pour autre chose qu'un indicateur Please Wait. Publié ce site:

https://www.vistax64.com/powershell/16998-howto-create-windows-form-without-stopping-script-processing.html

$Form = New-Object system.Windows.Forms.Form 
$Form.Location= New-Object System.Drawing.Size(100,100) 
$Form.Size= New-Object System.Drawing.Size(550,170) 
$Form.StartPosition = "Manual" 
$Form.Visible=$false 
$Form.Enabled = $true 
$Form.Add_Shown({$Form.Activate()}) 

[reflection.assembly]::LoadWithPartialName("System.Windows.Forms") 
$file = (get-item 'C:\path_to_your_gif.gif') 
$img = [System.Drawing.Image]::Fromfile($file); 

[System.Windows.Forms.Application]::EnableVisualStyles(); 

$pictureBox = new-object Windows.Forms.PictureBox 
$pictureBox.Location = New-Object System.Drawing.Size(0,1) 
$pictureBox.Size = New-Object System.Drawing.Size(100,80) 
$pictureBox.Image = $img 
$Form.controls.add($pictureBox) 

$Label = New-Object System.Windows.Forms.Label 
$Label.Text = "Please wait for Installation to complete" 
$Label.Location= New-Object System.Drawing.Size(110,35) 
$Label.Size = New-Object System.Drawing.Size(400,25) 
$LabelFont = New-Object System.Drawing.Font("Tahoma",10, 
[System.Drawing.FontStyle]::Bold) 
$Label.Font = $PleaseWaitLabelFont 
$Label.BackColor = "white" 
$Form.Controls.Add($WaitLabel) 

$WaitForm.Topmost = $True 

$rs = [Management.Automation.Runspaces.RunspaceFactory]::CreateRunspace() 
$rs.Open() 
$rs.SessionStateProxy.SetVariable("Form", $Form) 
$data = [hashtable]::Synchronized(@{text=""}) 
$rs.SessionStateProxy.SetVariable("data", $data) 
$p = $rs.CreatePipeline({ [void] $Form.ShowDialog()}) 
$p.Input.Close() 
$p.InvokeAsync() 

## Enter the rest of your script here while you want the form to display 

$WaitForm.close() 
$rs.close() 
0

Pourquoi ne pas utiliser le contrôle progressBar mis en œuvre WinForms? Avec la vitesse d'animation "Marquee", le ProgressBar se comportera comme un "Please Wait" et ne sera pas arrêté et beaucoup plus facile à ajouter à votre script au lieu d'un gif.

Exemples d'utilisation progressBar dans Winforms: https://www.sapien.com/blog/2011/07/14/primalforms-2011-spotlight-on-the-progressbar-control/

+0

Hm, de façon surprenante que le contrôle n'a jamais été soulevée quand je faisais des recherches sur les indicateurs. C'est très joli. Si je ne peux pas réparer le formulaire avec le .gif alors ce n'est pas une mauvaise solution de contournement. Merci! –