Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Powershell 每隔一天跳过两次午夜约会的新时间跨度_Powershell - Fatal编程技术网

Powershell 每隔一天跳过两次午夜约会的新时间跨度

Powershell 每隔一天跳过两次午夜约会的新时间跨度,powershell,Powershell,我试图简单地计算用户密码过期的天数。我使用时间跨度来完成这项工作。我的实务守则如下: (New-TimeSpan -Start (get-date -hour 0 -minute 0 -second 0) -End (Get-Date $_.PasswordLastSet -hour 0 -minute 0 -second 0).AddDays(90)).Days 因此,如果当前日期比上次设置密码的日期晚90天,则密码过期的天数为0 不幸的是,这段代码将连续许多天返回相同的结果。由于某些原因,

我试图简单地计算用户密码过期的天数。我使用时间跨度来完成这项工作。我的实务守则如下:

(New-TimeSpan -Start (get-date -hour 0 -minute 0 -second 0) -End (Get-Date $_.PasswordLastSet -hour 0 -minute 0 -second 0).AddDays(90)).Days
因此,如果当前日期比上次设置密码的日期晚90天,则密码过期的天数为0

不幸的是,这段代码将连续许多天返回相同的结果。由于某些原因,我似乎无法得到完全一致的结果,我假设这取决于一天中的时间,但不确定为什么。大多数时候,我们每隔一天跳过一次。所以如果我们每天都运行这个,我们将返回4,4,2,2,0,0

要轻松复制,您可以使用以下方法:

$x = (get-date).AddDays(-90)
(New-TimeSpan -Start (get-date $x -hour 0 -minute 0 -second 0).AddDays(90) -End (get-date -hour 0 -minute 0 -second 0)).Days
(New-TimeSpan -Start (get-date $x -hour 0 -minute 0 -second 0).AddDays(89) -End (get-date -hour 0 -minute 0 -second 0)).Days

为什么这么难?您可以从90天前的日期中减去当前日期,然后检索
总天数

(Get-Date) - (Get-Date).AddDays(-90) | Select-Object -ExpandProperty TotalDays
现在只需检查结果是否为
-le 90


注意:由于Igor发现总毫秒数可能是问题的根源,因此我建议只检索一次日期:

$date= Get-Date
$date - $date.AddDays(-90) | Select-Object -ExpandProperty TotalDays

然后你就不必处理小时、分钟、秒、毫秒和滴答声了。

好的,我找到了。这取决于毫秒。有时差异是1天几毫秒。有时,这几毫秒会移到另一侧,因此差值为23小时59分59秒78毫秒(例如)。这显示为0天

要查看它,只需从示例中删除
.Hours
,然后尝试复制它

    New-TimeSpan -Start (get-date $x -hour 0 -minute 0 -second 0).AddDays(89) -End (get-date -hour 0 -minute 0 -second 0)

Days              : 0
Hours             : 23
Minutes           : 59
Seconds           : 59
Milliseconds      : 78
Ticks             : 863990781260
TotalDays         : 0.999989330162037
TotalHours        : 23.9997439238889
TotalMinutes      : 1439.98463543333
TotalSeconds      : 86399.078126
TotalMilliseconds : 86399078.126

要解决这个问题,只需在计算中加上一秒钟,就可以得到正确的天数。

对于我来说,它返回
0
1
以及
AddDays(89)
。这是正确的,不是吗?只是为了确认它可以复制。我在三个不同的系统上试过这个代码。在第一个测试中,我连续得到了0,1(正如预期的那样)。但在另外两个系统中,我得到了0,0。在重复测试中,数字是随机的0,0或0,1。事实上,我认为这暴露了问题。使用(TimeSpan).Days返回int。由于某种原因,如果我使用
(Get Date-hour 0-minute 0-second 0)-(Get Date-hour 0-minute 0-second 0)。AddDays(-90)。AddDays(89)|选择Object-ExpandProperty TotalDays
则返回0.999999…,而不是1。这就是跳过的原因。你知道为什么会返回这个值吗?奇怪!没有线索。但是您可以简单地将返回值强制转换为
[int]
[int]((Get Date-hour 0-minute 0-second 0)-(Get Date-hour 0-minute 0-second 0)。AddDays(-90)。AddDays(89)| Select Object-ExpandProperty TotalDays)
我想我使用Igor的提示找到了解决方案,请检查我在原始代码中编辑的回答,Marco使用了两次Get Date,一次是检查当前日期,第二次是检查上次设置密码的日期。谢谢你的回答,我想这是由准确的滴答声造成的。使用Martins answer中的代码,我随机返回1和0.99。这个解决方案应该有效。@MacPower如果你检查我编辑的答案,不需要额外增加一秒钟。不幸的是@MartinBrandl我确实需要使用get date两次,因为我在问题的第一个代码块中使用了确切的用例。不过,我相信这将有助于未来的人们。