2017-08-11 112 views
-1

我有一個要求列出所有比X天更早的文件,但我需要在「yyyyMMdd」格式的日期文件名上運行此比較,而不是上次修改時間文件。PowerShell文件名與日期比較

+4

你嘗試過什麼?如果你分享迄今爲止所做的工作以及你被困住的地方,你更有可能在這裏得到幫助。 –

回答

0
  • 以下腳本將忽略文件名中日期的任何前綴/後綴/擴展名

$XDays = -20 
$Until = (get-date -Hour 0 -Minute 0 -Second 0).AddDays($XDays) 
"match files until {0}" -f $Until.ToString('yyyyMMdd') 

# This RE will match any date in this century (but not validate it) 
$RE = [RegEx]'^.*?(?<date>20[01][0-9][01][0-9][0-3][0-9]).*$' 

Get-ChildItem "*20[01][0-9][01][0-9][0-3][0-9]*" | Sort BaseName| ForEach-Object { 
    If ($_.BaseName -Match $RE){ 
     If ([datetime]::ParseExact($Matches.date,'yyyyMMdd',$null) -le $Until){ 
      $_ 
     } 
    } 
}  

要修改從當前目錄中的格式輸出改變內$_$_.FullName$_.Name

輸出示例:

PS A:\> .\SO_45642524.ps1 
match files until 20170723 

    Directory: A:\ 

Mode    LastWriteTime   Length Name 
----    -------------   ------ ---- 
-a----  08/11/2017  23:35    8 prefix20170718suffix.txt 
-a----  08/11/2017  23:35    8 prefix20170719suffix.txt 
-a----  08/11/2017  23:35    8 prefix20170720suffix.txt 
-a----  08/11/2017  23:35    8 prefix20170721suffix.txt 
-a----  08/11/2017  23:35    8 prefix20170722suffix.txt 
-a----  08/11/2017  23:35    8 prefix20170723suffix.txt 
+0

感謝您的回答。 我試過這個代碼片段,但它沒有返回所需的文件。 直到這個標記Get-ChildItem「* 20 [01] [0-9] [01] [0-9] [0-3] [0-9] *」,它的一切都很好。但在foreach中,parseexact不起作用。是否有可能將所有解析的日期存儲在另一個對象的屬性中? –

+0

然後[編輯](https://stackoverflow.com/posts/45642524/edit)您的問題提供您的文件名稱樣本和你的期望。很難與錯過的細節爭論。 – LotPings

+0

嘿,那是我的錯誤。我只是在正則表達式中做了一個小改動,並且工作。 –

0

是這樣的嗎?

Get-ChildItem "c:\temp" -file | where { $_.LastWriteTime.Date.ToString("yyyyMMdd") -le "20111203" } 

or this?

Get-ChildItem "c:\temp" -file | where { (get-date $_.LastWriteTime -Format "yyyyMMdd") -le "20170803" } 
0

您將需要去除文件名並將日期部分轉換爲日期時間值,之後您將能夠將其刪除。下面是如何將其轉換爲datetime一個例子:

gci -Filter *.txt | select Name, @{Name="DateFile"; Expression = {[datetime]::ParseExact($_.BaseName.substring(5),'yyyyMMdd',$null)}} 

enter image description here

並刪除舊超過一週可以說這些文件,我會做如下:

gci -Filter *.txt | Select-Object FullName, @{Name="DateFile"; Expression = {[datetime]::ParseExact($_.BaseName.substring(5),'yyyyMMdd',$null)}} | Where-Object {$_.DateFile -lt (get-date).AddDays(-7)} | ForEach-Object {Remove-Item -Path $_.FullName}