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
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? –