我正在使用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
?
答案 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} }