Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
File 比较文件';使用'-等式';不起作用_File_Date_Powershell - Fatal编程技术网

File 比较文件';使用'-等式';不起作用

File 比较文件';使用'-等式';不起作用,file,date,powershell,File,Date,Powershell,我正在使用PowerShell脚本验证远程生产服务器上的文件日期。该检查向部署工具输出一个代码号,以报告通过或失败的结果,以指示文件是否正确 这是可行的,但是我唯一的问题是,我无法让下面的脚本使用-eq,而是使用-gt,将文件日期放在脚本中比实际文件日期少一天。例如,在脚本中输入2014年11月17日以检查2014年11月18日的文件 $FileExe= Get-ChildItem "C:\filepath\file.exe" | Where-Object {$_.LastWriteTi

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

这是可行的,但是我唯一的问题是,我无法让下面的脚本使用
-eq
,而是使用
-gt
,将文件日期放在脚本中比实际文件日期少一天。例如,在脚本中输入2014年11月17日以检查2014年11月18日的文件

$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}
假设该文件是正确的2014年11月18日文件,这将输出一个0,表示它通过。如果没有,那么它将输出一个4,指示错误的文件已就位,此时我可以进入并修复它

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


在这一点上,我不知所措。我的脚本是否有问题,或者是否有更好的方法来执行我在这里尝试执行的操作,从而实现
-eq

问题很简单。你把它当作一根绳子,但它不是。将LastWriteTime与之进行比较的对象是一个字符串,因此比较不会像预期的那样进行。相反,让我们看看LastWriteTime属性,看看应该将其与什么进行比较。以我的C:\Temp文件夹中的第一个对象为例,下面是我看到的:

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

IsPublic IsSerial Name                                     BaseType                                                                                                                                                                                              
-------- -------- ----                                     --------                                                                                                                                                                                              
True     True     DateTime                                 System.ValueType 
好的,这是日期时间,不是字符串。获取DateTime对象很简单,只需使用GetDate即可。因此,出于您的考虑,请考虑:

$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"}

这里有两个问题。正如MadTechnician所指出的,您正在尝试比较日期时间和字符串。然而,更重要的问题是有关日期的准确性。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,时间设置为午夜):

经过编辑,添加了以下内容:在进行更多测试后,不需要获取用于比较的DateTime对象:

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

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

考虑以下几点

获取日期“2014年6月10日”
返回
2014年10月6日星期一上午12:00:00
如您所见,默认时间为午夜。您的
-eq
比较正在使用该时间。除非你的最后一次写作时间实际上是在午夜,否则比较结果会是错误的,这是有道理的。如果您只想知道更改是否发生在当天,只需比较
LastWriteTime的日期

$_.LastWriteTime.Date -eq "10/06/2014"
这样,您就可以在各自日期的午夜比较这两个日期


这里讨论了一些关于布尔值的左手操作。它只显示powershell将尝试对操作员右侧的内容执行的操作

如果使用-gt,则得到以下结果:Mode LastWriteTime Length Name--------a---11/18/2014 2:03 PM 21176320 file.exe,但如果使用-eq,则会得到NULL。无论是否使用out string属性,这两个结果都是相同的。我必须与静态日期时间戳进行比较。您不需要DateTime对象,但由于
eq
左侧有一个对象,PowerShell将尝试将“2014-11-18”转换为DateTime以进行比较
$_.LastWriteTime.Date -eq "10/06/2014"