【问题标题】:If statement in powershell with -lt value for date does not calculate properly for years?如果 powershell 中带有 -lt 日期值的语句多年来不能正确计算?
【发布时间】:2022-01-25 06:30:07
【问题描述】:

我已经使用这个脚本大约一年了,似乎任何 22 年的值都没有被视为大于当前的 21 年...我的格式不正确吗? csv 文件只是一个用户名,MM/DD/YY 格式。由于日期是明年而不工作的脚本的特定部分是:if($today -lt $EndDate)... 相对而言似乎可以工作几个月和几天,但不能工作几年?

在我的测试文件中,我有一个用户的日期为 22 年 1 月 3 日,脚本说日期已经结束(这意味着 $today 不小于 $enddate 值,实际上是明年)

任何指针?

$Import_csv = Import-Csv -Path "C:\temp\namesanddates.csv"

# Get today's date
$today = Get-Date -format MM/dd/yy

# Begin import csv process

$Import_csv | ForEach-Object {

    # Retrieve DN of User
    $UserDN = (Get-ADUser -Identity $_.Name).distinguishedName
    
    # Error check missing date - set to tomorrow
    $EndDate = (Get-Date).AddDays(1).ToString("MM/dd/yy")
    # Try to use date entered from file
    $EndDate   = (Get-Date $_.date).toString("MM/dd/yy")

    Write-Host "Current User:" $UserDN
    Write-Host "End Date in file:" $EndDate

if($today -lt $EndDate){
    Write-Host "User affected:" $UserDN
    Write-Host "Moving Accounts....." $UserDN

}else{
    Write-Output "User account date ended for:" $UserDN
    }
} 
Write-Host "Script Complete"

更新:感谢大家的反馈 - 通过取出 .toString 转换并排除任何格式 - Powershell 似乎在没有干预的情况下正确导入日期,然后比较有效。但是 - 如果我在代码中保留“-format MM/dd/yy”,小于比较仍然失败。两个变量都显示为日期时间和 | % gettype - 但它仍然说 01/03/22 小于今天的日期。

我将我的代码更改为以下内容,它现在似乎可以正常工作 - 似乎“格式”选项是 -lt 比较的原因。

$Import_csv = Import-Csv -Path "C:\temp\namesanddates.csv"

# Get today's date
$today = Get-Date 

# Begin import csv process

$Import_csv | ForEach-Object {

    # Retrieve DN of User
    $UserDN = (Get-ADUser -Identity $_.Name).distinguishedName
    
    # Error check missing date - set to today
    $EndDate = $today
    # Try to use date entered from file
    $EndDate = Get-Date $_.date

    Write-Host "Current User:" $UserDN
    Write-Host "End Date in file:" $EndDate

if($today -lt $EndDate){
    Write-Host "User affected:" $UserDN
    Write-Host "Moving Accounts....." $UserDN

}else{
    Write-Output "User account date ended for:" $UserDN
    }
} 
Write-Host "Script Complete"

【问题讨论】:

  • 当您执行 ToString 时,您将其转换为字符串,那么比较将是字符串比较,而不是日期比较。例如,字符串 2/1/21 将大于字符串 1/1/22。
  • 始终使用DateTime 比较日期和时间
  • 正如其他人指出的那样...... 除非绝对需要,否则不要比较日期字符串......相反,比较日期时间对象。
  • 将所有日期转换为 [datetime] 类型。除非您有 ISO-8601、yyyy-MM-dd 格式的字符串,否则不要使用字符串。

标签: powershell date if-statement


【解决方案1】:

正如其他人提到的,这里的问题是您将日期对象 ($today) 与字符串 ($EndDate) 进行比较

你需要修改如下

Import_csv = Import-Csv -Path "C:\temp\namesanddates.csv"

# Get today's date
$today = Get-Date -format MM/dd/yy

# Begin import csv process
$Import_csv | ForEach-Object {

# Retrieve DN of User
$UserDN = (Get-ADUser -Identity $_.Name).distinguishedName

# use date entered from file
EndDate   = Get-Date $_.date

Write-Host "Current User:" $UserDN
Write-Host "End Date in file: $($EndDate.toString("MM/dd/yy"))"

if($today -lt $EndDate){
    Write-Host "User affected:" $UserDN
    Write-Host "Moving Accounts....." $UserDN
}
else{
    Write-Output "User account date ended for:" $UserDN
    }
} 
Write-Host "Script Complete"

【讨论】:

  • 在变量 $today 上有“-format MM/dd/yy”显然是让它失败的原因——我不太明白为什么——但即使我的变量 $today 和 $ enddate 是日期时间,当我包含 -format MM/dd/yy 时,小于比较不准确。让 powershell 自己导入格式可以正确执行小于比较。我更新了我的帖子 - 谢谢!
【解决方案2】:

作为字符串,是有道理的。要做的一件事是在比较中让左侧为日期时间类型,右侧将自动转换。

$today = Get-Date  # 12/24/21
$today | % gettype

IsPublic IsSerial Name                                     BaseType
-------- -------- ----                                     --------
True     True     DateTime                                 System.ValueType


$today -lt '01/03/22'

True

通常人们使用这样的日期字符串,可以排序:

Get-Date -format yyyy/MM/dd

2021/12/24

【讨论】:

  • 感谢您提供故障排除信息 - 通过您的输入,我能够确定即使不使用字符串,而是使用 DateTime 的值类型,当格式设置为 MM 时,比较仍然不起作用/dd/年。值得庆幸的是,PS 足够聪明,可以导入格式 MM/dd/yy 并将其正确地自动转换为它自己的格式,而无需任何输入。我无法更改格式,因为导出是由另一个系统以这种方式编码的。通过去掉 -format MM/dd/yy 和 .toString 选项 - 它似乎可以自行正常工作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-15
  • 1970-01-01
  • 2020-07-05
  • 2011-01-01
  • 2023-03-12
  • 2019-08-03
相关资源
最近更新 更多