【问题标题】:Comparing new-timspan totalhours .... not functioning as expected比较 new-timspan totalhours .... 未按预期运行
【发布时间】:2015-11-16 14:15:14
【问题描述】:

我正在尝试比较两个日期并根据小时数差距做出决定,但比较似乎不起作用。我试图将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"
}

【问题讨论】:

  • 您是否首先在脚本中的其他位置设置$ok?如果是这样,那可能是导致问题的原因

标签: powershell compare


【解决方案1】:

您的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 = [int]$difference.TotalHours -gt 24 更简洁一些,它确保$ok 有一个值,无论时间跨度是否> 24。如果$ok 设置在更高编号的范围内,那么它将如果时间跨度为
  • @user2460798 这是真的。有许多种做事方式。只要你明白,真的不会有错误的答案。如图所示,如果您完全省略 $ok 逻辑,代码会更简洁。
  • 重点是 $ok 变量通过一个代码路径未初始化。
猜你喜欢
  • 2013-09-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-03
  • 1970-01-01
相关资源
最近更新 更多