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变量通过一个代码路径未初始化。