我从注册表中的 REG_QWORD 获取了刻度计数。然后,我显示刻度计数和数据类型,以验证我得到了预期的结果:
ticks = 638254472943517809 (data type = ulong)
到目前为止,一切都很好。但是当我尝试将其转换为 DateTime 时,我收到此错误消息:
Write-Error: Cannot convert value "638254472943517809" to type "System.DateTime". Error: "String '638254472943517809' was not recognized as a valid DateTime."
这是我的代码。注释掉的行是我在网上找到的各种技术,所有这些技术都失败并出现相同的错误:
Write-Host "Ticks = $ticks (data type = $($ticks.getType()))"
# $dateTime = [DateTime]$ticks
# $dateTime = Get-Date -date $ticks
# $dateTime = Get-Date [long]$ticks
PowerShell 验证 $ticks 变量是预期的 ulong(请参阅上面的第一个输出)。但是当我尝试在下一行中将其转换为 DateTime 时,PowerShell 表示 $ticks 变量是一个字符串。
我做错了什么?
$PS版本表:
Name Value
---- -----
PSVersion 7.3.6
PSEdition Core
GitCommitId 7.3.6
OS Microsoft Windows 10.0.19045
Platform Win32NT
PSCompatibleVersions {1.0, 2.0, 3.0, 4.0…}
PSRemotingProtocolVersion 2.3
SerializationVersion 1.1.0.1
WSManStackVersion 3.0
最佳答案
为了清楚地说明示例失败的原因,当转换发生时,PowerShell 会尝试许多不同的绑定(bind)来将源类型转换为目标类型,在您的例子中,为 ulong
进入datetime
。最常见的绑定(bind)尝试发生在 type's constructor overloads 上。 ,其 Parse
方法(如果该类型已定义)且 explicit / implicit defined conversions ,同样,如果该类型已定义, IConvertible
类型是否实现接口(interface)等等。请参阅Conversions doc了解更深入的细节。
错误:
...Error: "String '638254472943517809' was not recognized as a valid DateTime."
告诉我们 PowerShell 尝试使用 [datetime]::Parse
method 进行转换它接受一个字符串作为输入,如果成功,将生成一个新的日期时间结构实例。因此,发生的情况是,您拥有的 ulong
首先被强制转换为 string
,因此错误消息中的 String '638254472943517809'
。
通过一些帮助,您可以告诉 PowerShell 以 long
ctor overload 为目标那么将 ulong
转换为 long
就没有问题了,一切都很好!
$ticks = [ulong] 638254472943517809
[datetime]::new($ticks)
Thursday, July 20, 2023 10:54:54 AM
如果在转换 datetime
之前转换 long
,也会发生同样的情况:
[datetime] [long] [ulong] 638254472943517809
Thursday, July 20, 2023 10:54:54 AM
Get-Date
示例也是正确的,只是缺少括号,因此从 ulong
到 long
的转换发生在参数传递给 cmdlet 之前:
Get-Date ([long] $ticks)
注意: Windows PowerShell 5.1 及更早版本中不存在 [ulong]
类型加速器,在这些版本中您将使用 [uint64]
相反,或者您可以通过反射将 [ulong]
加速器添加到当前 session :
[powershell].Assembly.
GetType('System.Management.Automation.TypeAccelerators')::Add('ulong', [UInt64])
关于powershell - 如何在 PowerShell 中将 Ticks 字符串转换为日期时间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/76732252/