Powershell计时器:不启动任何操作

问题描述

我希望我的计时器查阅文件(consigne.csv),并根据我定义的日期显示“ consigne”列。 该文件的数据将定期修改,因此可以选择计时器。 窗体打开正确的信息,但该信息不会更新。 感谢您的帮助。

脚本:

Add-Type -AssemblyName System.Windows.Forms
Add-Type -AssemblyName System.Drawing
[System.Windows.Forms.Application]::EnableVisualStyles();

################ TIMER ##################################

    $Timer = new-object System.Windows.forms.timer
    $Timer.Interval = 1000 

    #Action.
    $Timer.Add_Tick({
                       #Interval after boot.
                        $Timer.Interval = (5000)
                       #Command
                        $global:today = get-date -format "dd/MM/yy"
                        $global:DesktopPath = [System.Environment]::GetFolderPath([System.Environment+SpecialFolder]::Desktop)
                        $global:TxtConsigne= (import-csv "$DesktopPath\consigne.csv" -encoding UTF8 -delimiter ";")
                        $global:Message = ($TxtConsigne | where-object {$_.EXPIRATION -ge $today})

                    })

################ Form #####################################

#Form

    $Form = New-Object System.Windows.Forms.Form
    $Form.Location = New-Object System.Drawing.Point 0,570
    $Form.Size = New-Object System.Drawing.Size(1920,260)
    
# Consigne
    
    $Consigne           = New-Object system.windows.Forms.Label
    $Consigne.Location  = New-Object System.Drawing.Point 210,20
    $Consigne.Size      = New-Object System.Drawing.Size(1500,220)
    $Form.Controls.Add($Consigne)

################################################################################################################

# $DesktopPath = [System.Environment]::GetFolderPath([System.Environment+SpecialFolder]::Desktop)
# $TxtConsigne= (import-csv "$DesktopPath\consigne.csv" -encoding UTF8 -delimiter ";")
# $Message = ($TxtConsigne | where-object {$_.EXPIRATION -ge $today})

$Timer.Start()

    if ($Message){

        $Message | FOREACH{
            
        $Mess += "- " + $_.Consigne + "`n"
            
            $Consigne.Text = $Mess      
        }

        $Mess=$null




        #Affichage de la fenêtre uniquement si consigne à passer
        [void]$Form.ShowDialog()

    }
    
$Timer.Stop()

和consigne.csv的内容

DATE; EXPIRATION; CONSIGNE; 12/09/20; 15/09/20;消息4; 11/09/20; 11/09/20;消息3; 10/09/20; 11/09/20;消息2; 10/09/20; 10/09/20;消息1;

解决方法

您不需要在Timer事件处理程序中使用所有这些$global:xxx变量;只要一个到CSV文件的路径就足够了。另外,它可以使用较小的范围:$script:xxx

然后,您正在将日期与格式为dd/MM/yy的格式化字符串进行比较,由于日期早于月份,所以日期与您想象的不一样。 (它是不可排序的日期格式)。

始终尝试将日期时间对象与其他日期时间对象进行比较。

尝试:

Add-Type -AssemblyName System.Windows.Forms
Add-Type -AssemblyName System.Drawing
[System.Windows.Forms.Application]::EnableVisualStyles();

# the path to the csv file used in the timer event handler.
$csvPath = Join-Path -Path ([Environment]::GetFolderPath("Desktop")) -ChildPath 'consigne.csv'

################ Form #####################################

#Form
$Form = New-Object System.Windows.Forms.Form
$Form.Location = New-Object System.Drawing.Point 0,570
$Form.Size = New-Object System.Drawing.Size(1920,260)

# Consigne
$Consigne           = New-Object System.Windows.Forms.Label
$Consigne.Location  = New-Object System.Drawing.Point 210,20
$Consigne.Size      = New-Object System.Drawing.Size(1500,200)
$Form.Controls.Add($Consigne)

################ TIMER ##################################

$Timer = New-Object System.Windows.forms.timer
$Timer.Enabled = $false  # disabled at first
$Timer.Interval = 50     # initial timer interval 

# Timer Action.
$Timer.Add_Tick({
    $this.Interval = 5000              # inside the event handler,you can refer to the control with `$this`
    $Consigne.Text = [string]::Empty   # clear the label
    # read the CSV file,get the items with an EXPIRATION date greater
    # or equal to today and write the CONSIGNE messages to the label
    (Import-Csv -Path $script:csvPath -Encoding UTF8 -Delimiter ";") |
    Where-Object { [datetime]::ParseExact($_.EXPIRATION,'dd/MM/yy',$null) -ge (Get-Date).Date } |
    ForEach-Object {$Consigne.Text += "- {0}`r`n" -f $_.CONSIGNE }
})

# start the timer as soon as the form is shown
$Form.Add_Shown({$Timer.Enabled = $true; $Timer.Start()})
[void]$Form.ShowDialog()

# clean up the Timer and Form objects
$Timer.Dispose()
$Form.Dispose()