Traitée [resolu] script powershell timer

  • miércoles, 18 de enero de 2012 9:42
     
     

    bonjour

    J'aurai besoin d'aide pour petit script Powershell utilisant un timer.

    J'aimerai que dans feuille form avec 2 champs texte que le bouton OK soit grisé pendant 5 secondes et soit automatiquement validé bout de 10 secondes.

    Plusieurs jours que je suis dessus, mais je n'y arrive pas.

    Merci pour votre aide.


    • Editado mehedij miércoles, 25 de enero de 2012 13:39
    •  

Todas las respuestas

  • jueves, 19 de enero de 2012 8:56
     
     Respondida Tiene código

    Bonjour et désolé de cette réponse un peu tardive.
    Pour faire ce que dont vous avez envie, je pense qu'il serait intéressant de passer via une action sur un événement du Timer.

    $timer = new-object timers.timer
    $timer.Interval = 5000 # milliseconds
    
    $action = {
         # Votre action ici
         $timer.stop()
         Unregister-Event TimerConfirm
    }
    
    Register-ObjectEvent -InputObject $timer -EventName elapsed `
    –SourceIdentifier  TimerConfirm -Action $action
    
    $timer.start()
    

    Après, dans votre cas, vous voulez faire deux actions. Une après 5 secondes et un à 10 sec. Il est alors possible soit de créer deux timer soit de gérer une condition dans le scriptblock $action :

    $timer = new-object timers.timer
    $timer.Interval = 5000 # milliseconds
    $cpt = 1
    
    $action = {
        if($cpt -eq 1) {
            # aprés 5 sec
            # Action pour dégriser la cellule
            $cpt++
        } else {
            # aprés 10 sec
            # Validation du formulaire
            $timer.stop()
             Unregister-Event TimerConfirm
        }
    }
    
    Register-ObjectEvent -InputObject $timer -EventName elapsed `
    –SourceIdentifier  TimerConfirm -Action $action
    
    $timer.start()

    Bien Cordialement,
    Richard Lazaro.

  • lunes, 23 de enero de 2012 10:22
     
      Tiene código

    Merci beaucoup pour cette réponse pas si tardive que cela. Je très content de pouvoir trouver de l'aide.

    Finalement je vais me contenter juste de l'autovalidation de mon formulaire au bout de 5 secondes. Mais l'exemple à plusieurs actions est quand même utile, il me permet tout de même comprendre un peu mieux le mécanisme.

    Mais malheureusement je n'y arrive toujours pas. Une fois que la fenêtre est affichée il semble que le temps s’arrête. Je n'arrive pas à effectuer une action (autre que les événements souris-clavier). J'ai tourné le code dans tous les sens , ça ne marche pas.

    Autre chose, j'utilise powerGui et quand je lance mon script 2 fois ça plante. je suis obligé de refermer à chaque essai. Il semble que le timer n'est pas remis à zéro.


    Voici mon code de test :

    clear
    
    [void] [System.Reflection.Assembly]::LoadWithPartialName("System.Drawing")
    [void] [System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms") 
    
    	#******* gestion des zones de textes
    		### Zone de Text identifiant
    			$objTextBox_login_X=200
    			$objTextBox_login_Y=60
    			$objTextBox_login_hauteur=30
    			$objTextBox_login_longueur=230
    		### Zone de Text passwords
    			$objTextBox_pass_X=200
    			$objTextBox_pass_Y=120
    			$objTextBox_pass_hauteur=30
    			$objTextBox_pass_longueur=230
    
    	#******* gestion des Labels
    		### Label de la Zone de Text identifiant
    			$objLabel_login_X=200
    			$objLabel_login_Y=40
    			$objLabel_login_hauteur=20
    			$objLabel_login_longueur=280
    		### Label de la Zone de Text passwords
    			$objLabel_Pass_X=200
    			$objLabel_Pass_Y=100
    			$objLabel_Pass_hauteur=20
    			$objLabel_Pass_longueur=280
    
    	#******* gestion des boutons
    		### Bouton OK
    			$OKButton_X=200
    			$OKButton_Y=220
    			$OKButton_hauteur=23
    			$OKButton_longueur=75
    		### Bouton Annuler
    			$CancelButton_X=285
    			$CancelButton_Y=220
    			$CancelButton_hauteur=23
    			$CancelButton_longueur=75
    		### form	
    			$global:objform_longueur=500
    			$global:objform_hauteur=280
    
    	#****** getstion timer
    	$timer = new-object timers.timer
    		$timer.Interval = 5000 # milliseconds
    
    		$action = {
    		     	# Votre action ici
    				$sortie=0 ; $global:Utilisateur=$objTextBox.Text;$global:MotDePasse=$objTextBox2.Text;$objForm.Close()
    		     	$timer.stop()
    		     	Unregister-Event TimerConfirm
    				}
    		Register-ObjectEvent -InputObject $timer -EventName elapsed –SourceIdentifier  TimerConfirm -Action $action
    
    function windows_auth {
    	
    	param (
    			$global:objform_hauteur = $(throw '$objform_hauteur is required'),
    	        $global:objform_longueur = $(throw '$objform_longueur is required'),
    			$global:Utilisateur = $(throw '$global:utilisateur is required'),
    			$global:MotDePasse = $(throw '$global:MotDePasse is required')
    			)
    
    		### affichage du champ mot de passe
    		$objTextBox2 = New-Object System.Windows.Forms.TextBox 
    		$objTextBox2.Location = New-Object System.Drawing.Size($objTextBox_pass_X,$objTextBox_pass_Y) 
    		$objTextBox2.Size = New-Object System.Drawing.Size($objTextBox_pass_longueur,$objTextBox_pass_hauteur)
    		$objTextBox2.PasswordChar = "*"
    		
    		### gestion du bouton OK
    		$OKButton = New-Object System.Windows.Forms.Button
    		$OKButton.Location = New-Object System.Drawing.Size($OKButton_X,$OKButton_Y)
    		$OKButton.Size = New-Object System.Drawing.Size($OKButton_longueur,$OKButton_hauteur)
    		$OKButton.Text = "OK"
    		$OKButton.Add_Click({$sortie=0 ; $global:Utilisateur=$objTextBox.Text;$global:MotDePasse=$objTextBox2.Text;$objForm.Close()})
    	
    		### gestion du bouton annuler
    		$CancelButton = New-Object System.Windows.Forms.Button
    		$CancelButton.Location = New-Object System.Drawing.Size($CancelButton_X,$CancelButton_Y)
    		$CancelButton.Size = New-Object System.Drawing.Size($CancelButton_longueur,$CancelButton_hauteur)
    		$CancelButton.Text = "Annuler"
    		$CancelButton.Add_Click({$sortie=1 ;$objForm.Close()})
    				
    		### ecriture de l'intitulé du champ utilisateur
    		$objLabel = New-Object System.Windows.Forms.Label
    		$objLabel.Location = New-Object System.Drawing.Size($objLabel_login_X,$objLabel_login_Y) 
    		$objLabel.Size = New-Object System.Drawing.Size($objLabel_login_longueur,$objLabel_login_hauteur) 
    		$objLabel.Text = "Nom d'utilisateur :"
    	
    		### ecriture de l'intitulé du champ mot de passe
    		$objLabel2 = New-Object System.Windows.Forms.Label
    		$objLabel2.Location = New-Object System.Drawing.Size($objLabel_Pass_X,$objLabel_Pass_Y) 
    		$objLabel2.Size = New-Object System.Drawing.Size($objLabel_Pass_longueur,$objLabel_Pass_hauteur) 
    		$objLabel2.Text = "Mot de passe :"
    	
    		### affichage du champ utilisateur
    		$objTextBox = New-Object System.Windows.Forms.TextBox 
    		$objTextBox.Location = New-Object System.Drawing.Size($objTextBox_login_X,$objTextBox_login_Y) 
    		$objTextBox.Size = New-Object System.Drawing.Size($objTextBox_login_longueur,$objTextBox_login_hauteu) 
    		$objTextBox.font = new-object system.drawing.font("Arial","12")
    
    		#### on cree la feuille de dialogue
    		$script:objForm = New-Object System.Windows.Forms.Form 
    		$objForm.Text = "Connexion réseau"
    		$objForm.Size = New-Object System.Drawing.Size($global:objform_longueur,$global:objform_hauteur) 
    		$objForm.StartPosition = "CenterScreen"
    		
    		### gestion des boutons à partir des touches du clavier
    		$objForm.KeyPreview = $True
    		$objForm.Add_KeyDown({if ($_.KeyCode -eq "Enter") 
    			{$sortie=0; $global:Utilisateur=$objTextBox.Text;$global:MotDePasse=$objTextBox2.Text;$objForm.Close()}})
    		$objForm.Add_KeyDown({if ($_.KeyCode -eq "Escape") 
    			{$sortie=1; $objForm.Close() }})
    		
    		#$OKButton.Enabled = $True
           	
    		$objForm.Controls.Add($OKButton)
    		$objForm.Controls.Add($CancelButton)
    		$objForm.Controls.Add($objLabel)
    		$objForm.Controls.Add($objLabel2)
    		$objForm.Controls.Add($objTextBox)
    		$objForm.Controls.Add($objTextBox2)
    		
    		### ???
    		$objForm.Topmost = $True
    		#start-sleep -Milliseconds (3000)
    		
    		
    		
    		### affichage du formulaire
    		$objForm.Add_Shown({$objForm.Activate()})
    		[void] $objForm.ShowDialog()
    		
    		
    		
    		### si on annule
    		if ($sortie -eq 1) {exit}
    		
    		
    }
    
    
    
    
    		
    
    
    ### afficher la fenetre		
    windows_auth "$objform_hauteur" "$objform_longueur" "$global:Utilisateur" "$global:MotDePasse"
    
    ### demarrage timer pour autovalider le formulaire au bout de 5 secondes
    		$timer.start()
    
    ### resultat
    echo "utilisateur : $global:Utilisateur"
    echo "mot de passe : $global:MotDePasse"
    

    Bien Cordialement

    Mehedi

     

  • miércoles, 25 de enero de 2012 13:32
     
     Respondida Tiene código

    J'ai trouvé la solution, je ne sais si c'est très élégant par contre mais je suis passé par une progress bar caché. voir code ci-dessous.

    clear
    
    [void][Reflection.Assembly]::LoadWithPartialName('System.Windows.Forms')
    #
    # Timer
    $timer = new-object System.Windows.forms.timer
    $timer.Interval = 100 # 1 seconde
    #
    # progressBar1
    #
    $progressBar1 = new-object System.Windows.Forms.ProgressBar
    $progressBar1.Location = new-object System.Drawing.Point(58, 107)
    $progressBar1.Name = 'progressBar1'
    $progressBar1.Size = new-object System.Drawing.Size(164, 23)
    $progressBar1.Value = 0
    $progressbar1.style = 'continuous'
    $progressbar1.step = 1
    $progressbar1.Visible = $False
    #
    # Label1
    #
    $label1 = new-object System.Windows.Forms.Label
    $label1.Location = new-object System.Drawing.Point(70, 70)
    $label1.Size = new-object System.Drawing.Size(139,13)
    $label1.Text = 'Style continuous :'
    
    $textbox1 = new-object System.Windows.Forms.TextBox
    $textbox1.Location = new-object System.Drawing.Point(70, 100)
    $textbox1.Size = new-object System.Drawing.Size(139,13)
    $textbox1.Text = 'nom utilisateur'
    
    #
    #boutton OK
    #
    $OKButton = New-Object System.Windows.Forms.Button
    $OKButton.Location = New-Object System.Drawing.Size(120,240)
    $OKButton.Size = New-Object System.Drawing.Size(50,20)
    $OKButton.Text = "OK"
    $OKButton.enabled = $false
    $OKButton.Add_Click({$utilisateur=$textbox1.Text;$Form1.Close()})
    
    $Form1 = new-object System.Windows.Forms.form
    # Form1
    #
    $Form1.Controls.Add($label1)
    $Form1.Controls.Add($textbox1)
    $Form1.Controls.Add($OKButton)
    $Form1.ClientSize = new-object System.Drawing.Size(284, 264)
    $Form1.Controls.Add($progressBar1)
    
    $Form1.Text = "Barre de progression - 1"
    
    
    
    
    $timer.Add_Tick({
          $progressBar1.PerformStep()
    	  if ($progressBar1.Value -lt 100) {$val = $progressBar1.Value;$label1.Text ="Style continuous : $val %"}
    	  if ($progressBar1.Value -gt 50) {$val = $progressBar1.Value;$label1.Text ="Style continuous : $val %";$OKButton.enabled = $true}
    	  if ($progressBar1.Value -eq 100) {$utilisateur=$textbox1.Text;$Form1.Close()}
    })
    
    $timer.Start()
    $Form1.activate()
    $Form1.ShowDialog()
    
    
    
    $label2 = new-object System.Windows.Forms.Label
    $label2.Location = new-object System.Drawing.Point(70, 70)
    $label2.Size = new-object System.Drawing.Size(139,13)
    $label2.Text = $utilisateur
    
    $Form2 = new-object System.Windows.Forms.form
    # Form1
    #
    $Form2.Controls.Add($label2)
    $Form2.ClientSize = new-object System.Drawing.Size(284, 264)
    $Form2.Text = "Résultat"
    $Form2.Activate()
    $Form2.ShowDialog()
    


    • Marcado como respuesta mehedij miércoles, 25 de enero de 2012 13:33
    •