Я пытаюсь перезагрузить компьютер в последний день недели месяца.Сценарий выполняется ежедневно в 7:25 вечера, и цель состоит в том, чтобы проверить текущую дату и посмотреть, является ли это последний день недели месяца.Если это так, он перезагружает ПК.Если это не так, это регистрирует, что это не так.
Я подумал, что, возможно, 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 "
}