2017-06-22 4 views
1

以下のPowerShellスクリプトがあります。すべてのファイルをzipファイル(6月2017.7z)として現在の月のzipファイルに圧縮します。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 

ありがとうございました。

EDIT: Remove-Item $ file.FullName -exclude * .ps1を追加してアーカイブファイルを削除しました。

+0

あなたのスクリプトは、過去30日間に見えるあなたが何を意図していることでしょうか?月(6月、7月など)で欲しいですか? – 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オブジェクトには、.addDaysメソッドとMonthプロパティの代わりに利用できる.addMonthsメソッドがあります。あなたは賢明なグループ化がIMO意味をなさないん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

パフォーマンスを使用してメンバーのすべてを観察することができます。 ファイルは格納され、グループ化され、最後に読み出され、すべて1つが圧縮されます。

オンザフライで正しいジップを特定することは問題ありません。

# 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する

  • 月名とアンダースコアアウトヌル
  • チェック$LastExitCodeゼロであれば、削除ファイルへの7zの
  • リダイレクト出力を変更
+1

OPには1か月以上のものすべてが必要なので、GCI $ dump_path |?{$ _。LastWriteTime.Month -le [datetime] :: today.addmonths(-1).Month - !!$ _PSIsContainer} 'を実行し、それをあなたの' ForEach'にパイプします。また、一貫性を保つために、 'LastWriteTime'または' CreationTime'を参照してください。あなたを責めないで、OPはそれをしましたが、もしあなたがコードを改善しているなら、あなたは余分なマイルに行くかもしれません。 – TheMadTechnician

+0

私はそれについて考えると、異なる日付が意味をなさないかもしれません。先月変更されていないファイルをアーカイブすることは、作成日を変更しないでアーカイブすることです(作成日を保存せずにファイルを書き直すアプリを除いて残りのもの)。 – LotPings

+0

@ LotPingsのコードでは、30日以上経過していないファイルを別のzipファイルに圧縮していないため、ファイルの作成日/修正日に基づいて月と年のzipファイル名を付けていません。 – Mixer

関連する問題