gpt4 book ai didi

PowerShell 日期比较不正确

转载 作者:行者123 更新时间:2023-12-01 09:44:31 24 4
gpt4 key购买 nike

我正在尝试在本月的最后一个工作日重新启动电脑。该脚本每天晚上 7:25 运行,目标是检查今天的日期,看看它是否是该月的最后一个工作日。如果是,它会重新启动 PC。如果不是,则记录它不是。

我在想,也许 PowerShell 正在按刻度进行比较,而 Get-Weekday 函数和 Get-Date 函数的运行时间之间的刻度略有不同。

日志摘录:

COMP1 - 09/26/2018 17:24:08 - Not last weekday of month 09/28/2018 17:24:08 > 09/26/2018 17:24:08 
COMP1 - 09/27/2018 17:24:09 - Not last weekday of month 09/28/2018 17:24:09 > 09/27/2018 17:24:09
COMP1 - 09/28/2018 17:24:01 - Not last weekday of month 09/28/2018 17:24:01 > 09/28/2018 17:24:01
COMP1 - 09/28/2018 17:24:01 - Not last weekday of month 09/28/2018 17:24:01 > 09/28/2018 17:24:01

代码:

#Gets last weekday of the month
function Get-Weekday {
param(
$Month = $(Get-Date -format 'MM'),
$Year = $(Get-Date -format 'yyyy'),
$Days = 1..5
)
$MaxDays = [System.DateTime]::DaysInMonth($Year, $Month)
1..$MaxDays | ForEach-Object {
Get-Date -day $_ -Month $Month -Year $Year |
Where-Object { $Days -contains $_.DayOfWeek }
}
}

#Last day of the month
$lwom = (Get-Weekday -Month (Get-Date).Month) | Select-Object -Last 1
#Returns: 09/28/2018 17:24:16

# Get Today's date.
$ModDate = Get-Date
#Returns: 09/28/2018 17:24:16

#If Last day of month = Today's Date
if ( $lwom -eq $ModDate ) {


#Creates the wscript shell for the popup -- box automatically closes after 10 seconds, script sleeps for 60
$wshell = New-Object -ComObject Wscript.Shell
$wshell.Popup("This computer will reboot in 60 seconds. Click OK and save your work!",10,"Save Your Data",48+0)
$xCmdString = {sleep 60}
Invoke-Command $xCmdString

#Next popup created to reboot in 5 seconds.
$wshell.Popup("Rebooting...",4,"Rebooting",48+0)
$xCmdString = {sleep 5}
Invoke-Command $xCmdString
Restart-Computer -Force
}

else {
Add-Content 'EOM-reboot_log.txt' "$env:computername - $ModDate - Not last weekday of month $lwom > $ModDate "
}

最终解决方案:

function LastDayThisMonth {
return (Get-Date -Day 1).Date.AddMonths(1).AddDays(-1)
}

function WorkingDay {
param ([datetime]$date=(Get-Date).Date)
While (!([int]$date.DayOfWeek % 6)){$date=$date.AddDays(-1)}
Return $date.Date
}

$lwom = WorkingDay -Date (LastDayThisMonth) #Does not need .Date because it's already in the function.
$ModDate = (Get-Date).Date # .Date on the variables will return the date and ignores the time. Time become 12:00:00 AM of both da


if ( $lwom -eq $ModDate ) {

#Writes to the log file.
Add-Content 'c:\EOM-reboot_log.txt' "$env:computername - $ModDate - End of Month Weekday"

#Creates the wscript shell for the popup -- box automatically closes after 10 seconds, script sleeps for 60
$wshell = New-Object -ComObject Wscript.Shell
$wshell.Popup("This computer will reboot in 60 seconds. Click OK and save your work!",10,"Save Your Data",48+0)
$xCmdString = {sleep 60}
Invoke-Command $xCmdString

#Next popup created to reboot in 5 seconds.
$wshell.Popup("Rebooting...",4,"Rebooting",48+0)
$xCmdString = {sleep 5}
Invoke-Command $xCmdString
Restart-Computer -Force
}

else {
Add-Content 'c:\EOM-reboot_log.txt' "$env:computername - $ModDate - Not last weekday of month $lwom > $ModDate "
}

最佳答案

I was thinking maybe PowerShell is comparing by ticks and the ticks are off slightly between run time of the Get-Weekday function and the Get-Date function.

是的,这很容易测试...

$date1 = Get-Date
$date2 = Get-Date

$date1.ToString("dd-MM-yyyy hh:mm:ss:fff")
$date2.ToString("dd-MM-yyyy hh:mm:ss:fff")

$date1 -eq $date2

重复运行会显示成功和失败的混合,并表明 datetime 相等的唯一方法是 every 日期/时间值分别相同。

01-10-2018 09:11:02:729
01-10-2018 09:11:02:730
False

01-10-2018 09:11:04:378
01-10-2018 09:11:04:378
True

话虽如此,

$lwom -eq $ModDate 正在比较日期和时间$lwom.Date -eq $ModDate.Date 只会查看日期本身。因此,除非您在午夜之前运行此程序,否则将获得一致且可预测的结果。

关于PowerShell 日期比较不正确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52590730/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com