Powershell 比较新的timspan总小时数。。。。未按预期运行
我试着比较两个日期,并根据间隔小时数做出决定,但这种比较似乎不起作用。我试图将Powershell 比较新的timspan总小时数。。。。未按预期运行,powershell,compare,Powershell,Compare,我试着比较两个日期,并根据间隔小时数做出决定,但这种比较似乎不起作用。我试图将TotalHours转换为[int],但没有成功。让我吃惊的是,我使用-gt或-lt得到了相同的结果 这一定很简单,但我看不出来 这是密码 $stamp = "14/11/2015 14:20:57" $rightNow = Get-Date $stampDateTime = [datetime]::ParseExact($stamp,'dd/MM/yyyy HH:mm:ss',[Globalization.Cul
TotalHours
转换为[int]
,但没有成功。让我吃惊的是,我使用-gt
或-lt
得到了相同的结果
这一定很简单,但我看不出来
这是密码
$stamp = "14/11/2015 14:20:57"
$rightNow = Get-Date
$stampDateTime = [datetime]::ParseExact($stamp,'dd/MM/yyyy HH:mm:ss',[Globalization.CultureInfo]::InvariantCulture)
$difference = NEW-TIMESPAN –Start $stampDateTime –End $rightNow
if ([int]$difference.TotalHours -gt 24 ) { $ok = "OK" }
if ($ok){
Write-Host "VALID"
}else{
Write-Host "BAD"
}
您的if($ok)
就是问题所在。当计算为布尔值时,所有字符串都将返回true
将其更改为使用布尔值将是解决此问题的一种方法
if ([int]$difference.TotalHours -gt 24 ) { $ok = $true }
if ($ok){
Write-Host "VALID"
}else{
Write-Host "BAD"
}
您还应该在脚本的开头设置一个已知值,用作标志。这一点很重要,因为变量状态将在PowerShell会话中的两次执行之间保持不变
# assume false
$ok = $false
根据你的需要,你不需要保持这种逻辑。您可以同时绕过第二个if
,因为它是冗余的
if ([int]$difference.TotalHours -gt 24 ) {
Write-Host "VALID"
}else{
Write-Host "BAD"
}
我知道这可能只是你用来提问的简单例子
考虑以下内容以了解发生了什么。当转换为布尔值时,任何长度非零的字符串都将解析为$true
PS C:\> [boolean]"OK"
True
PS C:\> [boolean]"VeryBad"
True
PS C:\> [boolean]""
False
是否先在脚本中的其他位置设置
$ok
?如果是这样的话,这可能会导致问题写入$ok=[int]$difference.TotalHours-gt 24
更为简洁,它确保无论时间跨度是否大于24,$ok都有一个值。如果$ok设置在一个编号更高的范围内,那么它将被拾取并用于If语句中,如果timespan为@user2460798,则这是真的。做事的方法有很多种。只要你明白,就不会有错误的答案。如图所示,如果您只需完全省略$ok
逻辑,代码会更干净。重要的一点是,$ok变量通过一个代码路径未初始化。