2016-07-15 69 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

相關問題