2016-07-15 40 views
1

我有一些日期变量,用它来对特定目录中的文件执行查询。我可以GCI每个文件没有问题,如下面的例子:PowerShell v2.0 - 转换为日期时间

File1.xml 14/07/2016 17:09 
File2.xml 15/07/2016 09:32 

所以我在寻找一个特定的年龄范围和我的标准之间的所有文件是:

已成:

$Today4am = Get-Date -Hour 4 -Minute 0 -Second 0 

但不迟于

$Yesterday4am = $Today4am.AddDays(-1) 

变量输出

$Today4am = 15 July 2016 04:00:00 
$Yesterday4am = 14 July 2016 04:00:00 

因此,变量以不同的格式将文件本身排除在日期之外,所以我需要确保两种格式都相同以便进行比较。这里是原始脚本:

$Filter = gci c:\temp\*.xml | 
Where {$_.LastWriteTime -gt $Yesterday4am -and {$_.LastWriteTime-lt $Today4am}} 

错误的参数来操作 '-gt':无法比较 “14/07/2016 17时09分52秒” 为“14/07/2016 0 4:00 ”。错误:“无法转换值”14/07/2016 04:00“键入”System.DateTime“错误: ”字符串未被识别为有效的DateTime。“”。

因此,我尝试转换变量以添加-Format“dd/MM/yyyy HH:mm”并输出正确的格式。但转换$ Yesterday4am = $ Today4am.AddDays(-1)格式 “DD/MM/YYYY HH:MM”产生错误:

Cannot convert value "15/07/2016 04:00" to type "System.DateTime". Error: "String was not recognized as a valid DateTime." 

我怎样才能得到两个日期格式的同意?

回答

0

我相信这只是你的比较问题。如果您在下面运行我的脚本,您会看到它们都是“DateTime”类型。如果你格式化它们,它们会变成不容易比较的字符串。当我在下面运行我的Where-Object命令时,我没有任何错误。注:我使用PowerShell的版本5

PS> Write-Host "PowerShell Version: $($PSVersionTable.PSVersion.ToString())" 
PowerShell Version: 5.0.10586.122 

PS> $Today4am = Get-Date -Hour 4 -Minute 0 -Second 0 

PS> Write-Host "`$Today4am is type `"$($Today4am.GetType().FullName)`"" 
$Today4am is type "System.DateTime" 

PS> $Yesterday4am = $Today4am.AddDays(-1) 

PS> Write-Host "`$Yesterday4am is type `"$($Yesterday4am.GetType().FullName)`"" 
$Yesterday4am is type "System.DateTime" 

PS> $Filter = Get-ChildItem c:\temp\* | Where-Object -FilterScript { ($_.LastWriteTime -gt $Yesterday4am) -and ($_.LastWriteTime-lt $Today4am) } 

PS> $Filter 

Directory: C:\temp 


Mode    LastWriteTime   Length Name                                             
----    -------------   ------ ----                                             
-a----  7/14/2016 1:13 PM    0 asdfasd 
+0

超级!谢谢 - 作品一种享受!所以-filterscript是我的脚本的关键 - 不知道它是什么,但将查找它 – JDGEEK

+0

它实际上是Where-Object(Where)的默认参数,但我只是指定我打电话,所以人们知道。这可能是因为您在FilterScript {}表达式中使用了表达式括号。 –

1

尝试再次使用Get-date转换$Yesterday4amDateTime

| Where {$_.LastWriteTime -gt (Get-Date $Yesterday4am) -and {$_.LastWriteTime-lt $Today4am}} 

如果你担心性能,你可以做Where运营商之外的Get-Date转换:

$Yesterday4am = Get-Date $Yesterday4am 
$Filter = gci c:\temp\*.xml ` 
    | Where {$_.LastWriteTime -gt $Yesterday4am -and {$_.LastWriteTime-lt $Today4am}} 
+0

这将调用Get-日期为它不得不做一个比较的每个项目。对于少量文件来说可能不是什么大问题,但是如果您搜索的是大量XML文件,则可能会花费很长时间。 –

+0

22,000在目录中,因此过滤! – JDGEEK

相关问题