2017-06-22 117 views
1

我有下面的PowerShell脚本,它会将当前月份的所有文件压缩成一个zip文件作为zip文件名(June 2017.7z)。如何使用7Zip按月压缩文件

# set folder path 
    $dump_path = "C:\Users\Desktop\02_2017" 

    # set min age of files 
    $max_days = "-30" 

    # get the current date 
    $curr_date = Get-Date 

    # determine how far back we go based on current date 
    $zip_date = $curr_date.AddDays($max_days) 

    # filter files 
    $files = Get-ChildItem $dump_path | Where-Object { ($_.LastWriteTime -lt $zip_date) -and ($_.psIsContainer -eq $false) } 

    $groups = Get-ChildItem $dump_path | 
     Where-Object { ($_.LastWriteTime -lt $zip_date) -and ($_.psIsContainer -eq $false) } | 
     group {"{0:MMMM} {0:yyyy}" -f $_.CreationTime} 

    ForEach ($group in $groups) { 
     ForEach($file in $group.Group){ 
      & "C:\Program Files\7-Zip\7z.exe" u -mx9 -t7z -m0=lzma2 ($group.Name + ".7z") $file.FullName 
      Remove-Item $file.FullName -exclude *.ps1 
     } 
    } 

如何修改脚本,使其能够分别压缩每月创建的所有文件?例如,aaa1,aaa2,aaa3将压缩到aug_2016.7z,bbb1,bbb2,bbb3将压缩到feb_2017.7z等等,然后删除归档文件。

8/29/2016 11:09 PM   88583 aaa1.log 
8/30/2016 6:06 AM   88590 aaa2.log 
8/30/2016 7:07 AM   88586 aaa3 .log 
2/1/2017 6:03 AM   179412 bbb1.log 
2/1/2017 7:03 AM   179285 bbb2.log 
2/1/2017 8:03 AM   179418 bbb3.log 
5/3/2017 6:31 PM   95764 ccc1.log 
5/3/2017 8:33 PM   95605 ccc2.log 
5/3/2017 10:34 PM   95391 ccc3.log 

谢谢你的帮忙。

编辑: 添加Remove-Item $ file.FullName -exclude * .ps1删除归档文件。

+0

你的脚本看起来在过去的30天,是你想要什么?或者你想按月份(Jun,Jul等)? – TheIncorrigible1

+0

TheIncorrigible1,谢谢你指出。我需要归档所有超过30天的文件,并在归档后删除文件。这个脚本文件将每月执行一次。 – Mixer

回答

0

我能弄清楚我的问题。谢谢你的帮助。如果有人需要它,下面是脚本。

# set folder path 
$log_path = "C:\Users\pdo\Desktop\02_2017\log\*.log" 
$zip_path = "C:\Users\pdo\Desktop\02_2017\log\*.7z" 
$target_path = "C:\Users\pdo\Desktop\02_2017\log\" 

# set min age of files 
$max_days = "-30" 
$delete_max_days = "-365" 

# get the current date 
$curr_date = Get-Date 

# determine how far back we go based on current date 
$zip_date = $curr_date.AddDays($max_days) 
$delete_zip_date = $curr_date.AddDays($delete_max_days) 

#$zip_date = (Get-Date).AddMonths(0).Month 

# filter files 
Get-ChildItem $log_path | Where-Object { ($_.LastWriteTime -lt $zip_date) -and ($_.psIsContainer -eq $false)}| 

    ForEach { 
    $Zip = $target_path + "{0:MMM}_{0:yyyy}.7z" -f $_.LastWriteTime 
    & "C:\Program Files\7-Zip\7z.exe" u -mx9 -t7z -m0=lzma2 $Zip $_.FullName |Out-Null 
    If ($LastExitCode -eq 0) { Remove-Item $_.FullName } 
    } 

$deletefile = Get-ChildItem $zip_path | Where-Object { $_.LastWriteTime -lt $delete_zip_date } | Remove-Item 
0

DateTime对象有一个.addMonths方法可以用来代替.addDays方法以及Month属性。您可以通过使用Get-Date | Get-Member

# set folder path 
$dump_path = "C:\Users\Desktop\02_2017" 

# determine how far back we go based on current date 
$zip_date = (Get-Date).AddMonths(-1).Month 

# filter files 
$files = Get-ChildItem $dump_path | 
    Where-Object { (($_.LastWriteTime).Month -eq $zip_date) -and ($_.psIsContainer -eq $false) } 

$groups = Get-ChildItem $dump_path | 
    Where-Object { (($_.LastWriteTime).Month -eq $zip_date) -and ($_.psIsContainer -eq $false) } | 
    group {"{0:MMMM} {0:yyyy}" -f $_.CreationTime} 

ForEach ($group in $groups) { 
    ForEach($file in $group.Group) { 
    & "C:\Program Files\7-Zip\7z.exe" u -mx9 -t7z -m0=lzma2 ($group.Name + ".7z") $file.FullName 
    } 
} 
+0

这会缩短代码。谢谢! – Mixer

+0

如何将分别在同一个月创建的文件归档? – Mixer

3

性能明智的分组确实IMO没有意义遵守所有成员。 文件被存储,分组并且最终读出并且每一个都被压缩。

确定正确的拉链应该是没有问题的。

# set folder path 
$dump_path = "C:\Users\Desktop\02_2017" 
# determine how far back we go based on current date 
$zip_date = (Get-Date).AddMonths(0).Month 

# filter files 
Get-ChildItem $dump_path | 
    Where-Object {(($_.LastWriteTime).Month -le $zip_date) -and ($_.psIsContainer -eq $false)}| 
    ForEach { 
    $Zip = "{0:MMM}_{0:yyyy}.7z" -f $_.CreationTime 
    & "C:\Program Files\7-Zip\7z.exe" u -mx9 -t7z -m0=lzma2 $Zip $_.FullName |Out-Null 
    If ($LastExitCode -eq 0) { Remove-Item $_.FullName } 
    } 

编辑改变

  • 月份名称即可abriviation和下划线
  • 的7z格式输出重定向到Out-空
  • 检查$LastExitCode如果零删除文件
+1

OP提到他需要一个月以上的东西,所以你不妨做'GCI $ dump_path |?{$ _。LastWriteTime.Month -le [datetime] :: today.addmonths(-1).Month -and!$ _.PSIsContainer}'管道到你的'ForEach'。此外,为了保持一致性,可以引用'LastWriteTime'或'CreationTime',但不要混合和匹配。不是在指责你,OP是做到了,但是如果你正在改进代码,那么你可能还会付出更多努力。 – TheMadTechnician

+0

好吧,如果我考虑一下,不同的日期可能有意义。归档文件在上个月没有改变是一回事,但归档时没有改变创建时间(撇开一些应用程序重写文件而不保留创建日期)。 – LotPings

+0

@LotPings,您的代码没有将超过30天的文件压缩到不同的zip文件中,并根据创建/修改文件的日期命名带有月份和年份的zip文件。 – Mixer

相关问题