Get-childitem Lastwritetime 没有正确返回
Get-child item Lastwritetime is not returning properly
我正在尝试使用 get-childitem
命令获取 CreationTime
和 Lastwritetime
并将其与相同的组装时间进行比较,以检查每 5 分钟是否有任何差异。
奇怪的是,如果程序集没有更改并且导致比较对象失败,那么每次获取记录时都会有毫秒数的差异。
除了将时间转换为字符串格式之外,还有什么方法可以解决这个问题吗?
下面是获取程序集详细信息的命令
Get-ChildItem -Path 'C:\Windows\Microsoft.NET\assembly\GAC_MSIL' -include *.dll -Recurse|select @{Label=”AssemblyName”;Expression={$_.Name}},@{Label=”Size”; Expression={$_.Length}},@{label="Version";expression={if($_.versioninfo.productversion -eq $null) {
"NULL"
} else {
$_.versioninfo.productversion
}
}},@{Label=”CreationTime”; Expression={$_.CreationTime}},@{Label=”LastWriteTimeUtc”; Expression={$_.LastWriteTimeUtc}}
and 运行 此命令在 5 分钟后与 compare-object
进行比较
compare-object -$oldobject $newObject -property Name,Lastwritetime
我不知道为什么会有几毫秒的差异(很可能是 inaccurate floating point number)的确切原因。
此类问题的通常解决方案是在比较中使用 epsilon 值(这在游戏编程中很常见)。
Set-Variable -name EPSILON -value ([double]0.00001) #-option Constant
function Is-Same {
Param(
[Parameter(Mandatory = $true)] [double]$a,
[Parameter(Mandatory = $true)] [double]$b
)
#return $a - $b;
return [math]::abs($a - $b) -le $EPSILON;
}
Is-Same 1.000001 1.0000
Is-Same 1.00001 1.0000
Is-Same 1.0001 1.0000
True
False
False
根据需要调整 epsilon 值。 (遵守数值限制)
我正在尝试使用 get-childitem
命令获取 CreationTime
和 Lastwritetime
并将其与相同的组装时间进行比较,以检查每 5 分钟是否有任何差异。
奇怪的是,如果程序集没有更改并且导致比较对象失败,那么每次获取记录时都会有毫秒数的差异。
除了将时间转换为字符串格式之外,还有什么方法可以解决这个问题吗?
下面是获取程序集详细信息的命令
Get-ChildItem -Path 'C:\Windows\Microsoft.NET\assembly\GAC_MSIL' -include *.dll -Recurse|select @{Label=”AssemblyName”;Expression={$_.Name}},@{Label=”Size”; Expression={$_.Length}},@{label="Version";expression={if($_.versioninfo.productversion -eq $null) {
"NULL"
} else {
$_.versioninfo.productversion
}
}},@{Label=”CreationTime”; Expression={$_.CreationTime}},@{Label=”LastWriteTimeUtc”; Expression={$_.LastWriteTimeUtc}}
and 运行 此命令在 5 分钟后与 compare-object
进行比较compare-object -$oldobject $newObject -property Name,Lastwritetime
我不知道为什么会有几毫秒的差异(很可能是 inaccurate floating point number)的确切原因。
此类问题的通常解决方案是在比较中使用 epsilon 值(这在游戏编程中很常见)。
Set-Variable -name EPSILON -value ([double]0.00001) #-option Constant
function Is-Same {
Param(
[Parameter(Mandatory = $true)] [double]$a,
[Parameter(Mandatory = $true)] [double]$b
)
#return $a - $b;
return [math]::abs($a - $b) -le $EPSILON;
}
Is-Same 1.000001 1.0000
Is-Same 1.00001 1.0000
Is-Same 1.0001 1.0000
True
False
False
根据需要调整 epsilon 值。 (遵守数值限制)