问题描述
我希望我的计时器查阅文件(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()