2017-02-27 77 views
1

我有一個腳本,用於檢查文件夾並找到最舊的文件(由LastWrittenTime創建),並將找到的文件的LastWriteTime寫入日誌文件。PowerShell逐個查找文件

如果我再次運行此腳本,我希望它找到下一個最早的文件,該文件的LastWriteTime大於先前寫入日誌文件的文件。

但有一個問題。我的scipt每次只能找到文件夾中最舊的文件,並忽略日誌文件中的文件。

我的腳本:

$programdir = "C:\Data\PowerShell\Learning" 
$folder = "C:\Data\PowerShell\Learning\folder" #there is the files 
$TimeLog = "$programdir\LastFileDate.log" #this file contains the last found file's LastWriteTime attribute 
$LastWriteTime = Get-Content $TimeLog 
$File = Get-ChildItem -Path $folder | Sort-Object LastWriteTime -Descending | Select-Object -Last 1 | Where-Object {$_.LastWriteTime -gt $LastWriteTime} 
Clear-Content $TimeLog 
$File.LastWriteTime | Set-Content $TimeLog 
+0

多行獲得所有文件時間和自己比他們 – Drako

回答

1

你馬上削弱你的選擇設置這條線。具體其中你有Select-Object -Last 1

$File = Get-ChildItem -Path $folder | Sort-Object LastWriteTime -Descending | Select-Object -Last 1 | Where-Object {$_.LastWriteTime -gt $LastWriteTime} 

在你限制你的選擇設置爲1個文件倒數第二管聲明。然後你應用你的日期邏輯。您需要過濾日期第一個然後抓取相應的條目。

Get-ChildItem -Path $folder -File | 
    Sort-Object LastWriteTime -Descending | 
    Where-Object {$_.LastWriteTime -lt $LastWriteTime} | 
    Select-Object -First 1 

還有其他類似的方法也可以。


也...

Clear-Content $TimeLog 
$File.LastWriteTime | Set-Content $TimeLog 

是多餘的,因爲Set-Content將默認覆蓋。您可以刪除Clear-Content

雖然這不是您的代碼中的問題,請注意,由Get-Content返回的$LastWriteTime是一個字符串,而不是一個datetime對象。因爲它是在您的where語句的語句的RHS上投射爲[datetime]以評估該條款。

另外要小心你的代碼可能會採取不同的,如果有一個在您$timelog

+0

必須以最古老的開始!所以Where-Object {$ _。LastWriteTime -lt $ LastWriteTime}不正確。必須用-gt $ LastWriteTime。最後,它將成爲Do - While循環的一部分! 你有什麼想法嗎? –

+0

@NorbertKiss你真的嘗試過嗎?在實踐中,這工作得很好。我們需要先取得所有的第一個,然後抓住最新的一個。 – Matt