使用' -eq'比较文件的LastWriteTime不起作用

时间:2014-11-18 19:54:17

标签: file date powershell

我正在使用PowerShell脚本验证远程生产服务器上的文件日期。检查会向我们的部署工具输出一个代码,以报告通过或失败的结果,以指示文件是否正确。

这是有效的,但是我遇到的唯一问题是我无法使用以下脚本来使用-eq而是使用-gt并将文件日期放在脚本中一天比实际的文件日期。例如,2014年11月17日在脚本中检查11/18/2014文件。

$FileExe= Get-ChildItem "C:\filepath\file.exe" |
    Where-Object {$_.LastWriteTime -gt "11/17/2014"} | Out-String

if($FileExe){Write-Host '0'} else{Write-Host '4';Exit 4}

假设文件是​​正确的11/18/2014文件,这将输出0,表示它已通过。如果没有,那么它输出一个4表示错误的文件到位,我可以进入并修复它。

如果我将-gt更改为-eq并更改脚本中的日期以匹配实际文件日期(本例中为11/18/2014),脚本将失败并输出错误码。尽管脚本中的文件日期和日期是正确的,但这是正确的。

此时,我不知所措。我的脚本是否有问题,或者是否有更好的方法来执行我要在此处执行的操作-eq

3 个答案:

答案 0 :(得分:3)

为了帮助补充其他答案,我认为值得指出的是,您正在测试的-eq操作非常不太可行。您正在将字符串日期“11/18/2014”与日期时间值LastWriteTime进行比较。字符串日期将转换为DateTime,以便比较起作用。

考虑以下

Get-Date "10/06/2014"返回Monday, October 06, 2014 12:00:00 AM 如你所见,有一段时间默认为午夜。您的-eq比较正在使用该时间。除非您的LastWriteTime实际上是在午夜,否则比较将返回false并且恰好如此。如果您只是想知道更改是当天,只需要比较LastWriteTime的日期

$_.LastWriteTime.Date -eq "10/06/2014"

这样您就可以比较各个日子午夜的两个日期。

这个answer谈到了左手操作的布尔值。它只是展示了powershell将尝试使用运营商右侧的内容。

答案 1 :(得分:2)

问题很简单。你将它视为一个字符串,但事实并非如此。您正在比较LastWriteTime的对象是一个字符串,因此您的比较不会像您期望的那样发生。相反,让我们看看LastWriteTime属性,看看你应该将它与之比较。只是以我的C:\ Temp文件夹中的第一个对象为例,这就是我所看到的:

PS C:\windows\system32> (gci c:\temp)[0].LastWriteTime.GetType()

IsPublic IsSerial Name                                     BaseType                                                                                                                                                                                              
-------- -------- ----                                     --------                                                                                                                                                                                              
True     True     DateTime                                 System.ValueType 

好的,所以它是一个DateTime,而不是一个字符串。获取DateTime对象很简单,只需使用Get-Date即可。因此,为了您的目的,请考虑以下事项:

$Date = Get-Date "11/18/2014"
$FileExe= Get-ChildItem "C:\filepath\file.exe" | Where-Object {$_.LastWriteTime -eq $date}
If($FileExe){"The last write was on $date"}else{"The last write was not on $date"}

答案 2 :(得分:0)

这里有两个问题。正如TheMadTechnician指出的那样,你正在尝试比较DateTime和一个字符串。但是,更重要的问题是所涉日期的精确度。 LastWriteTime属性存储最长为毫秒的日期时间。当您使用日期获得DateTime时,它将指定午夜时间。

$ > $d1 = Get-Date
$ > $d1

Tuesday, November 18, 2014 2:27:16 PM

$ > $d2 = Get-Date "2014-11-18"
$ > $d2

Tuesday, November 18, 2014 12:00:00 AM

$ > $d1 -eq $d2
False

但是,由于它是一个DateTime对象,您可以使用Date属性来获取日期(实际上,它返回一个完整的DateTime,时间设置为午夜):

$dt = Get-Date "2014-11-18"
gci | ? { $_.LastWriteTime.Date -eq $dt }

编辑添加测试后再多一点,您不需要获取DateTime对象进行比较:

gci | ? { $_.LastWriteTime.Date -eq "2014-11-18} }