比较new-timspan totalhours ....没有按预期运行

时间:2015-11-16 14:15:14

标签: 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.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"
}

1 个答案:

答案 0 :(得分:2)

您的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"
}

我知道这可能只是你用来提出问题的简单例子。

请考虑以下内容以了解发生的情况。当转换为布尔值时,任何非零长度字符串都将解析为$。

PS C:\> [boolean]"OK"
True

PS C:\> [boolean]"VeryBad"
True

PS C:\> [boolean]""
False