2017-09-22 1 views
3

Je suis en train de créer une fenêtre contextuelle qui reste ouverte jusqu'à la fin du script.Powershell fermeture popup boîte

J'ai le code suivant pour créer une boîte popup

$wshell = New-Object -ComObject Wscript.Shell 

$wshell.Popup("Operation Completed",0,"Done",0x1) 

$wshell.quit 

je me suis dit $ wshell.quit fermerait la fenêtre, mais il ne fonctionne pas. Y at-il un moyen de fermer cette boîte de dialogue à partir du script sans interaction de l'utilisateur?

+0

Je ne pense pas un popup comme ça est conçu pour être fermé par programme. Une solution serait de créer votre propre formulaire et de le fermer. Fondamentalement, une boîte de message faite sur commande? –

Répondre

0

L'utilisation de $wsheel.quit ne fonctionnera pas ici parce que dans PowerShell lorsque vous exécutez $wshell.Popup(..) la session attendra jusqu'à ce que le formulaire est fermé.
Vous ne pourrez exécuter aucune autre commande jusqu'à ce que la fenêtre soit fermée. Ce que vous pouvez faire est de créer la fenêtre popup dans une session différente et par cela vous pouvez exécuter votre code et quand votre code fini, recherchez le travail et le tuer.

Solution # 1:

function killJobAndItChilds($jobPid){ 
    $childs = Get-WmiObject win32_process | where {$_.ParentProcessId -eq $jobPid} 
    foreach($child in $childs){ 
     kill $child.ProcessId 
    } 
} 

function Kill-PopUp($parentPid){ 
    killJobAndItChilds $parentPid 
    Get-Job | Stop-Job 
    Get-Job | Remove-Job 
} 

function Execute-PopUp(){ 
    $popupTitle = "Done" 
    $popupScriptBlock = { 
     param([string]$title) 
     $wshell = New-Object -ComObject Wscript.Shell 

     $wshell.Popup("Operation Completed",0,$title,0x1) 
    } 

    $job = Start-Job -ScriptBlock $popupScriptBlock -ArgumentList $popupTitle 

    # Waiting till the popup will be up. 
    # Can cause bugs if you have other window with the same title, so beaware for the title to be unique 
    Do{ 
     $windowsTitle = Get-Process | where {$_.mainWindowTitle -eq $popupTitle } 
    }while($windowsTitle -eq $null) 
} 

Execute-PopUp 

#[YOUR SCRIPT STARTS HERE] 
Write-Host "Your code" 
Start-Sleep 3 
#[YOUR SCRIPT ENDs HERE] 


Kill-PopUp $pid 

Il crée votre pop-up et seulement lorsque la fenêtre est en place (vérification par le titre Notez qu'il peut causer colissions si un autre processus avec le même. le titre de la fenêtre) votre code va commencer à courir.
Lorsque votre code se terminera, il va tuer le travail.
Notez que je n'ai pas utilisé Stop-Job pour arrêter le travail.
Je suppose que quand le travail a créé le pop-up, il ne peut pas recevoir de commandes jusqu'à ce que le popup soit proche.
Pour le surmonter je tue le processus du travail.

Solution # 2 (en utilisant les événements):

function Kill-PopUp(){ 
    kill (Get-Event -SourceIdentifier ChildPID).Messagedata 
    Get-Job | Stop-Job 
    Get-Job | Remove-Job 
} 

function Execute-PopUp(){ 
    $popupTitle = "Done" 
    $popupScriptBlock = { 
     param([string]$title) 
     Register-EngineEvent -SourceIdentifier ChildPID -Forward 
     New-Event -SourceIdentifier ChildPID -MessageData $pid > $null 
     $wshell = New-Object -ComObject Wscript.Shell 

     $wshell.Popup("Operation Completed",0,$title,0x1) 
    } 

    $job = Start-Job -ScriptBlock $popupScriptBlock -ArgumentList $popupTitle 

    # Waiting till the popup will be up. 
    # Can cause bugs if you have other window with the same title, so beaware for the title to be unique 
    Do{ 
     $windowsTitle = Get-Process | where {$_.mainWindowTitle -eq $popupTitle } 
    }while($windowsTitle -eq $null) 
} 

Execute-PopUp 

#[YOUR SCRIPT STARTS HERE] 
Write-Host "Your code" 
Start-Sleep 3 
#[YOUR SCRIPT ENDs HERE] 


Kill-PopUp 
0

Vous pouvez, à partir de la coquille d'alimentation, Internet Explorer ouvert, l'affichage d'une page html locale (alias un écran de démarrage), puis, lorsque vous avez terminé, fermez-le

$IE=new-object -com internetexplorer.application 
$IE.navigate2("www.microsoft.com") 
$IE.visible=$true 
... 
$IE.Quit() 

Quelques lectures Ici https://social.technet.microsoft.com/Forums/ie/en-US/e54555bd-00bb-4ef9-9cb0-177644ba19e2/how-to-open-url-through-powershell?forum=winserverpowershell

Certains lire plus ici How to properly close Internet Explorer when launched from PowerShell?

0

Voir https://msdn.microsoft.com/en-us/library/x83z1d9f(v=vs.84).aspx pour les paramètres. Celui dont vous avez besoin est [nSecondsToWait], si la valeur est 0, le script attend independant, utilisez une valeur pour les secondes et il se fermera tout seul.

intButton = wShell.Popup (strText, [nSecondsToWait], [strTitle], [nType])

Une autre façon serait d'envoyer un keystoke à la boîte de dialogue avec wshShell.SendKeys "%N"

En utilisant la première méthode ici un exemple de ce que vous pourriez faire. J'utilise vbscript ici, aucune expérience avec PowerShell mais c'est presque la même solution.

Set wShell = WScript.CreateObject("WScript.Shell") 
count = 1 
result = -1 
Do while result = -1 
    result = wShell.Popup("Operation Completed", 1, "Done", 0) 
    count = count + 1 
    Wscript.echo count 
    if count = 10 then Exit Do ' or whatever condition 
Loop 
+0

Vous n'avez pas besoin de le compter, car vous avez déjà défini 'nSecondsToWait' sur 1 pour que le pop-up dure 1 seconde. BTW, en Powershell votre code ressemblera à ce qui suit: '$ wshell = New-Object -ComObject Wscript.Shell $ count = 1 $ result = 0 Bien que ($ result -eq 0) { $ result = $ wshell .Popup ("Opération terminée", 1, "Terminé", 0) # '= 1' pas sûr de ce que vous vouliez ici $ count + = 1 Write-Host $ count if ($ count -eq 10) { Exit } } 'De toute façon, il veut que le popup reste ouvert ** jusqu'à ce que le script se termine **. – E235

+0

@ E235, iaa vous ne l'obtenez pas, de cette façon vous pouvez laisser le dialogue attendre aussi longtemps que vous voulez ET le fermer quand vous le souhaitez, et non, si vous utilisez un 0, le script ne finira jamais vous appuyez sur le bouton ou terminer la tâche – peter

+0

Je l'ai couru comme script VBS et je comprends ce que vous vouliez dire. Mais quand je l'ai couru, il change le titre au nombre "2" et après que vous ayez appuyé sur "OK" il le change en "3" et ainsi de suite jusqu'à 10. Et aussi, dans VBS vous pouvez courir 'wShell.Popup (..) 'et ensuite il passera à la commande suivante, mais dans PowerShell quand vous exécutez' $ wshell.Popup (..) 'il restera bloqué jusqu'à ce que vous fermiez le formulaire de la fenêtre et dans ce cas vous devrez utiliser les emplois de powershel . – E235