powershell - Powershell 中两个日期之间的减法计算结果为 null
问题描述
我正在使用以下代码显示一些值,两个日期之间的减法,如表达式 [datetime]::Now.AddDays(-365) - $_.PasswordLastSet).Days
在我的数据中评估为 null,可能是什么原因,如何修复此代码?
Get-ADUser -Filter * -Properties PasswordLastSet, Mail -SearchBase $searchBase |
Where-Object{
([datetime]::Now.AddDays(-365) - $_.PasswordLastSet).Days -in @(" ",364, 350, 354, 340, 335,' ','',"")
}|
Select-Object name, PasswordLastSet,@{n='DaysUntilExpired';e={(([datetime]::Now.AddDays(365) - [datetime]::$_.PasswordLastSet).Day).days}} |
Add-Content -Path C:\Temp\PasswordExpList.txt
解决方案
您的代码中有两个明显的错误,都在这里:
@{n='DaysUntilExpired';e={(([datetime]::Now.AddDays(365) - [datetime]::$_.PasswordLastSet).Day).days}}
但是,我不知道你是否应该指定这个:
@{n='DaysUntilExpired';e={([datetime]::Now.AddDays(365) - $_.PasswordLastSet).Days}}
或者,如果您要查找到期日期前一个月的最后一天,那么:
@{n='DaysUntilExpired';e={(([datetime]::Now.AddDays(365) - $_.PasswordLastSet.Day).Days}}
正如评论中提到的,[datetime]::$_.PasswordLastSet
是胡说八道。这是第一个错误。第二个是时间跨度的属性是Days
,不是Day
。Day
是日期时间的属性。
但是,假设您正在尝试计算 AD 密码策略定义的密码到期日期,您应该查看msDS-UserPasswordExpiryTimeComputed
AD 中的属性,因为那是该属性包含的内容。您必须将它从一个大整数日期转换,但这就是这样[datetime]::fromfiletime()
做的。
Get-ADUser -Filter * -Properties PasswordLastSet, Mail, 'msDS-UserPasswordExpiryTimeComputed' -SearchBase $searchBase |
Select-Object -Properties Name, PasswordLastSet, @{n='PasswordExpirationDate';e={[DateTime]::FromFileTime($_.'msDS-UserPasswordExpiryTimeComputed')}}
这并不能完成您的脚本所做的所有事情,但是我不明白您为什么要查找其密码设置为过去确切天数的帐户。这似乎没有用。
推荐阅读
- amazon-ecs - ECS 任务定义 App Mesh 虚拟节点名称未通过控制台设置
- c - 传递函数时与奇怪的 C 指针行为混淆
- sql - 如何回答这个问题:列出 1986 年聘用的员工
- jquery - 向下滚动时隐藏导航栏并在用户使用 jquery 向上滚动页面时显示它,不能正常工作
- r - 特殊堆积条形图 R ggplot
- c# - 如何在 C# 中通过 USB 在设备与计算机之间建立连接
- c++ - 如何将 Width*Height 大小的 RGB565 值的 1d 数组转换为 C++ 中的图像
- python-3.x - 为什么这个生成器可以使用 for 循环而不是 next()?
- r - R - 按收入中位数排序条形图
- yaml - 未评估 Ceedling 的 YAML 文件中的环境变量