IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Scripts/Batch Discussion :

[PowerShell] Incohérence sélection jour calendrier


Sujet :

Scripts/Batch

  1. #1
    Membre confirmé
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Octobre 2014
    Messages
    99
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Octobre 2014
    Messages : 99
    Par défaut [PowerShell] Incohérence sélection jour calendrier
    Bonjour,

    J'aimerai récupérer 2 dates choisies par l'utilisateur via un calendrier GUI

    J'ai donc crée un module avec une fonction qui prend des objets Windows.Forms.Form, Windows.Forms.MonthCalendar et Windows.Forms.Button en paramètre afin de créer un calendrier avec un certain nombre de paramètre :

    calendar.psm1
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    Add-Type -AssemblyName System.Windows.Forms
    Add-Type -AssemblyName System.Drawing
    
    function NewCalendarBis($form, $calendar, $okButton, $cancelButton){
            $form.StartPosition = [Windows.Forms.FormStartPosition]::CenterScreen
            $form.Size          = New-Object Drawing.Size 243, 230
            $form.Text          = 'Select a Date'
            $form.Topmost       = $true
    
            $calendar.ShowTodayCircle   = $false
            $calendar.MaxSelectionCount = 2
    
        $form.Controls.Add($calendar)
    
            $okButton.Location     = New-Object Drawing.Point 38, 165
            $okButton.Size         = New-Object Drawing.Size 75, 23
            $okButton.Text         = 'OK'
            $okButton.DialogResult = [Windows.Forms.DialogResult]::OK
    
        $form.AcceptButton = $okButton
        $form.Controls.Add($okButton)
    
            $cancelButton.Location     = New-Object Drawing.Point 113, 165
            $cancelButton.Size         = New-Object Drawing.Size 75, 23
            $cancelButton.Text         = 'Cancel'
            $cancelButton.DialogResult = [Windows.Forms.DialogResult]::Cancel
    
        $form.CancelButton = $cancelButton
        $form.Controls.Add($cancelButton)
    
        return $form
    
    }
    Et dans mon script, je crée les différents objets que je passe ensuite à cette fonction pour obtenir 2 calendriers et pouvoir les afficher successivement (pour la sélection d'une date de début puis une date de fin).

    Script.ps1
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    Import-Module C:\Scripts\calendarbis.psm1
    
    $form2 = New-Object Windows.Forms.Form
    $form1 = New-Object Windows.Forms.Form
    $calendar2 = New-Object Windows.Forms.MonthCalendar
    $calendar1 = New-Object Windows.Forms.MonthCalendar
    $okButton2 = New-Object Windows.Forms.Button
    $okButton1 = New-Object Windows.Forms.Button
    $cancelButton2 = New-Object Windows.Forms.Button
    $cancelButton1 = New-Object Windows.Forms.Button
    
    $calendrierForm2 = NewCalendar $form2 $calendar2 $okButton2 $cancelButton2
    $calendrierForm1 = NewCalendar $form1 $calendar1 $okButton1 $cancelButton1
    
    $res2 = $calendrierForm2.ShowDialog()
    if ($res2 -eq [Windows.Forms.DialogResult]::OK) {
        $date2 = $calendar2.SelectionStart
        Write-Host "Date selected: $($date2.ToShortDateString())"
    }
    
    $res1 = $calendrierForm1.ShowDialog()
    if ($res1 -eq [Windows.Forms.DialogResult]::OK) {
        $date1 = $calendar1.SelectionStart
        Write-Host "Date selected: $($date1.ToShortDateString())"
    }
    La chose bizarre que je ne comprends pas, c'est qu'après la première fois où j'ai exécuté le script (Powershell ISE), la date que m'affiche les Write-Host reste toujours la même à chaque fois que je ré-exécute le script (peu importe le jour cliqué dans le calendrier). En plus de cela, même la première fois que j'ai exécuté le script, il m'a affiché 2 fois la même date alors que j'avais sélectionné 2 dates différentes pour les 2 calendriers.

    Merci d'avance pour votre aide sur ce sujet

  2. #2
    Expert confirmé

    Homme Profil pro
    Responsable déploiement (SCCM, InTune, GPO)
    Inscrit en
    Juillet 2014
    Messages
    3 218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Responsable déploiement (SCCM, InTune, GPO)
    Secteur : Transports

    Informations forums :
    Inscription : Juillet 2014
    Messages : 3 218
    Par défaut
    Quelques incohérencse dans le nom du module/fonction, mais mis à part cela je ne constate pas le problème.
    Surement un soucis lors de ton débogage.

    calendar.psm1
    Code powershell : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    Add-Type -AssemblyName System.Windows.Forms
    Add-Type -AssemblyName System.Drawing
     
    function NewCalendar($form, $calendar, $okButton, $cancelButton)
    {
        $form.StartPosition = [Windows.Forms.FormStartPosition]::CenterScreen
        $form.Size          = New-Object Drawing.Size 243, 230
        $form.Text          = 'Select a Date'
        $form.Topmost       = $true
     
        $calendar.ShowTodayCircle   = $false
        $calendar.MaxSelectionCount = 2
     
        $form.Controls.Add($calendar)
     
        $okButton.Location     = New-Object Drawing.Point 38, 165
        $okButton.Size         = New-Object Drawing.Size 75, 23
        $okButton.Text         = 'OK'
        $okButton.DialogResult = [Windows.Forms.DialogResult]::OK
     
        $form.AcceptButton = $okButton
        $form.Controls.Add($okButton)
     
        $cancelButton.Location     = New-Object Drawing.Point 113, 165
        $cancelButton.Size         = New-Object Drawing.Size 75, 23
        $cancelButton.Text         = 'Cancel'
        $cancelButton.DialogResult = [Windows.Forms.DialogResult]::Cancel
     
        $form.CancelButton = $cancelButton
        $form.Controls.Add($cancelButton)
     
        return $form
     
    }

    Script.ps1
    Code powershell : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    Import-Module "${PSScriptRoot}\calendar.psm1" -Force
     
    $form2 = New-Object Windows.Forms.Form
    $form1 = New-Object Windows.Forms.Form
    $calendar2 = New-Object Windows.Forms.MonthCalendar
    $calendar1 = New-Object Windows.Forms.MonthCalendar
    $okButton2 = New-Object Windows.Forms.Button
    $okButton1 = New-Object Windows.Forms.Button
    $cancelButton2 = New-Object Windows.Forms.Button
    $cancelButton1 = New-Object Windows.Forms.Button
     
    $calendrierForm2 = NewCalendar $form2 $calendar2 $okButton2 $cancelButton2
    $calendrierForm1 = NewCalendar $form1 $calendar1 $okButton1 $cancelButton1
     
    $res2 = $calendrierForm2.ShowDialog()
    if ($res2 -eq [Windows.Forms.DialogResult]::OK) {
        $date2 = $calendar2.SelectionStart
        Write-Host "Date selected: $($date2.ToShortDateString())"
    }
     
    $res1 = $calendrierForm1.ShowDialog()
    if ($res1 -eq [Windows.Forms.DialogResult]::OK) {
        $date1 = $calendar1.SelectionStart
        Write-Host "Date selected: $($date1.ToShortDateString())"
    }

    PS : Pourquoi permettre la sélection de 2 jours ? $calendar.MaxSelectionCount = 2

  3. #3
    Membre confirmé
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Octobre 2014
    Messages
    99
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Octobre 2014
    Messages : 99
    Par défaut
    En fait je veux permettre à l'utilisateur de saisir une plage de date pour la consultation de logs (qu'ils choisissent d'afficher les logs de tel appli entre tel et tel date). Mais je n'ai pas trouvé le moment de sélectionner une plage de date comme cela peut se faire sur un site web.

    Pour mon probleme de variable qui est toujours la même, il ne peut pas s'agir d'histoire de portée de variable ou de contexte d'execution (que je ne maitrise pas super bien...)?

  4. #4
    Expert confirmé

    Homme Profil pro
    Responsable déploiement (SCCM, InTune, GPO)
    Inscrit en
    Juillet 2014
    Messages
    3 218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Responsable déploiement (SCCM, InTune, GPO)
    Secteur : Transports

    Informations forums :
    Inscription : Juillet 2014
    Messages : 3 218
    Par défaut
    J'arrive à sélectionner la date de début et fin dans le nombre de jour (2) autorisée en laissant la touche contrôle enfoncé.
    Non la le code fonctionne chez moi (celui que je t'ai transmis)

  5. #5
    Expert confirmé

    Homme Profil pro
    Responsable déploiement (SCCM, InTune, GPO)
    Inscrit en
    Juillet 2014
    Messages
    3 218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Responsable déploiement (SCCM, InTune, GPO)
    Secteur : Transports

    Informations forums :
    Inscription : Juillet 2014
    Messages : 3 218

  6. #6
    Expert confirmé

    Homme Profil pro
    Responsable déploiement (SCCM, InTune, GPO)
    Inscrit en
    Juillet 2014
    Messages
    3 218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Responsable déploiement (SCCM, InTune, GPO)
    Secteur : Transports

    Informations forums :
    Inscription : Juillet 2014
    Messages : 3 218
    Par défaut
    Du coup j'ai testé cela fonctionne assez bien

    Code powershell : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    Add-Type -AssemblyName System.Windows.Forms
    Add-Type -AssemblyName System.Drawing
     
    function NewCalendar($form, $calendar, $okButton, $cancelButton)
    {
        $form.StartPosition = [Windows.Forms.FormStartPosition]::CenterScreen
        $form.Size          = New-Object Drawing.Size 243, 230
        $form.Text          = 'Select a Date'
        $form.Topmost       = $true
     
        #$calendar.ShowTodayCircle   = $false
        $calendar.MaxSelectionCount = 200
     
        $form.Controls.Add($calendar)
     
        $okButton.Location     = New-Object Drawing.Point 38, 165
        $okButton.Size         = New-Object Drawing.Size 75, 23
        $okButton.Text         = 'OK'
        $okButton.DialogResult = [Windows.Forms.DialogResult]::OK
     
        $form.AcceptButton = $okButton
        $form.Controls.Add($okButton)
     
        $cancelButton.Location     = New-Object Drawing.Point 113, 165
        $cancelButton.Size         = New-Object Drawing.Size 75, 23
        $cancelButton.Text         = 'Cancel'
        $cancelButton.DialogResult = [Windows.Forms.DialogResult]::Cancel
     
        $form.CancelButton = $cancelButton
        $form.Controls.Add($cancelButton)
     
        return $form
     
    }

    Code powershell : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    Import-Module "${PSScriptRoot}\calendar.psm1" -Force
     
     
    $form1 = New-Object Windows.Forms.Form
    $calendar1 = New-Object Windows.Forms.MonthCalendar
    $okButton1 = New-Object Windows.Forms.Button
    $cancelButton1 = New-Object Windows.Forms.Button
     
    $calendrierForm1 = NewCalendar $form1 $calendar1 $okButton1 $cancelButton1
     
     
    $res1 = $calendrierForm1.ShowDialog()
    if ($res1 -eq [Windows.Forms.DialogResult]::OK)
    {
        $date1 = $calendar1.SelectionStart
        $date2 = $calendar1.SelectionEnd
        Write-Host "Date selected start: $($date1.ToShortDateString())"
        Write-Host "Date selected end  : $($date2.ToShortDateString())"
    }

  7. #7
    Membre confirmé
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Octobre 2014
    Messages
    99
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Octobre 2014
    Messages : 99
    Par défaut
    Salut.
    En effet ça fonctionne

    Par contre, le fait de devoir utiliser la touche Shift pour sélectionner une plage de date (un début et une fin), ça empêche que cette plage s'étale sur 2 mois différents...
    Parce que lorsque l'on change de mois, c'est le 1er du mois suivant qui est sélectionné comme SelectionStart.

    Il n'y a vraiment pas moyen que le premier clic sélectionne la SelectionStart et un second clic sélectionne la SelectionEnd, sans avoir à maintenir de touche et se retrouver avec le problème que je viens de citer ?

  8. #8
    Expert confirmé

    Homme Profil pro
    Responsable déploiement (SCCM, InTune, GPO)
    Inscrit en
    Juillet 2014
    Messages
    3 218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Responsable déploiement (SCCM, InTune, GPO)
    Secteur : Transports

    Informations forums :
    Inscription : Juillet 2014
    Messages : 3 218
    Par défaut
    Effectivement, il y a une note chez MS la dessus : https://learn.microsoft.com/en-us/do...op-7.0#remarks

  9. #9
    Membre confirmé
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Octobre 2014
    Messages
    99
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Octobre 2014
    Messages : 99
    Par défaut
    Salut.
    Donc oui, impossible de trouver un moyen de sélectionner un range sans devoir appuyer sur Shift.
    Et du coup, pour éviter le problème de changement de mois, et bah j'affiche un calendrier d'un an qui débute 1 an avant la date J ; et je mettrai un pop up avant l'apparition du calendrier pour expliquer l'histoire comment on sélectionne un range.

    Sinon, pour ceux que ça aiderai, j'ai trouver une fonction qui facilite la personnalisation du calendier.

    Merci pur les réponses en tout cas !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [OL-2003] Mise a jour calendrier
    Par valoche51_2 dans le forum Outlook
    Réponses: 4
    Dernier message: 01/07/2013, 11h04
  2. Declencher des alertes selon des jours (calendrier)
    Par Chikatilo dans le forum VBA Access
    Réponses: 7
    Dernier message: 29/10/2008, 10h45
  3. pb mise à jour calendrier
    Par antoine1504 dans le forum IHM
    Réponses: 14
    Dernier message: 04/07/2008, 08h10
  4. sélection date calendrier
    Par Nabouille dans le forum IHM
    Réponses: 6
    Dernier message: 17/12/2007, 11h24
  5. Sélection date Calendrier
    Par Sami Xite dans le forum Access
    Réponses: 7
    Dernier message: 19/02/2007, 11h35

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo