【问题标题】:Two identical properties not matching as expected两个相同的属性与预期不匹配
【发布时间】:2019-01-17 02:38:10
【问题描述】:

正如您从下面的示例中看到的,我期望两个 StartTime 属性在相互比较时返回 true。当我比较 StartTime 属性时,它返回 false,但当我比较任何其他属性时,它返回 true,如使用 Name 属性所示。这是日期时间的怪癖吗?

$MeterLog = Get-Content -Raw -Path (Join-Path $Path $File) | ConvertFrom-JSON 

$OpenApplications = get-process | where-object {$_.mainwindowhandle -ne 0 -and $_.Product -ne "Microsoft® Windows® Operating System"} | select-object Name, Description, Product, ProductVersion, Path, Company, StartTime


PS C:\ProgramData\agent> $OpenApplications[0] | gm


   TypeName: Selected.System.Diagnostics.Process

Name           MemberType   Definition                                                                    
----           ----------   ----------                                                                    
Equals         Method       bool Equals(System.Object obj)                                                
GetHashCode    Method       int GetHashCode()                                                             
GetType        Method       type GetType()                                                                
ToString       Method       string ToString()                                                             
Company        NoteProperty System.String Company=Google Inc.                                             
Description    NoteProperty System.String Description=Google Chrome                                       
Name           NoteProperty string Name=chrome                                                            
Path           NoteProperty System.String Path=C:\Program Files (x86)\Google\Chrome\Application\chrome.exe
Product        NoteProperty System.String Product=Google Chrome                                           
ProductVersion NoteProperty System.String ProductVersion=71.0.3578.98                                     
StartTime      NoteProperty datetime StartTime=11/01/2019 13:17:19                                        



PS C:\ProgramData\agent> $MeterLog.data[0] | gm


   TypeName: System.Management.Automation.PSCustomObject

Name           MemberType   Definition                                                             
----           ----------   ----------                                                             
Equals         Method       bool Equals(System.Object obj)                                         
GetHashCode    Method       int GetHashCode()                                                      
GetType        Method       type GetType()                                                         
ToString       Method       string ToString()                                                      
Company        NoteProperty string Company=Google Inc.                                             
Description    NoteProperty string Description=Google Chrome                                       
Name           NoteProperty string Name=chrome                                                     
Path           NoteProperty string Path=C:\Program Files (x86)\Google\Chrome\Application\chrome.exe
Product        NoteProperty string Product=Google Chrome                                           
ProductVersion NoteProperty string ProductVersion=71.0.3578.98                                     
StartTime      NoteProperty datetime StartTime=11/01/2019 13:17:19                                 

日期比较返回 false:

PS C:\ProgramData\agent> $MeterLog.data[0].StartTime -eq $OpenApplications[0].StartTime
False

任何其他返回 true 的属性示例:

PS C:\ProgramData\agent> $MeterLog.data[0].Name -eq $OpenApplications[0].Name
True

编辑:

PS C:\ProgramData\agent> $MeterLog.data[0].StartTime

11 January 2019 13:17:19


PS C:\ProgramData\agent> $OpenApplications[0].StartTime

11 January 2019 13:17:19

【问题讨论】:

  • 你是如何在两个变量中获取这些信息的?那就是 $OpenApplications 和 $MeterLog。
  • datetime 对象比默认显示的内容更详细。例如,您的两个道具显示秒为最少部分。还有毫秒...
  • @Persistent13 已更新以显示来源。 $Open... 直接来自运行 get-process$Meter... 是从 JSON 转换而来的。
  • @Lee_Dailey 我似乎无法证明这是真的——你能建议吗?
  • @Arbiter - 尝试.Ticks.TimeOfDay.Milliseconds 属性

标签: powershell


【解决方案1】:

问题是通过保存到 JSON 然后从 JSON 中检索来修改日期时间,我们可以在下面看到这一点。似乎 JSON 会以毫秒为单位删除小数点后的所有内容:

PS C:\ProgramData\agent> $MeterLog.data[0].StartTime.TimeOfDay


Days              : 0
Hours             : 13
Minutes           : 17
Seconds           : 19
Milliseconds      : 176
Ticks             : 478391760000
TotalDays         : 0.553694166666667
TotalHours        : 13.28866
TotalMinutes      : 797.3196
TotalSeconds      : 47839.176
TotalMilliseconds : 47839176



PS C:\ProgramData\agent> $OpenApplications[0].StartTime.TimeOfDay


Days              : 0
Hours             : 13
Minutes           : 17
Seconds           : 19
Milliseconds      : 176
Ticks             : 478391769286
TotalDays         : 0.553694177414352
TotalHours        : 13.2886602579444
TotalMinutes      : 797.319615476667
TotalSeconds      : 47839.1769286
TotalMilliseconds : 47839176.9286

【讨论】:

  • 根据您要执行的导出操作,您可能需要考虑使用 PowerShell 库中的 ConvertTo-Expression。它将对象序列化为 PowerShell 表达式,并且对 PowerShell 对象类型更严格。
猜你喜欢
  • 2015-07-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-15
  • 2018-08-21
  • 1970-01-01
相关资源
最近更新 更多