web-dev-qa-db-ja.com

PowerShellを使用して15日以上経過したファイルを削除する

特定のフォルダに15日以上前に作成されたファイルのみを削除したいです。 PowerShellを使ってこれを行うにはどうすればよいですか。

160
user2470170

与えられた答えはファイルを削除するだけです(確かにこの記事のタイトルにあるものです)、ここで最初に15日以上前のファイルをすべて削除し、次に残っているかもしれない空のディレクトリを再帰的に削除するコード後ろに。私のコードでは、隠しファイルと読み取り専用ファイルも削除するために-Forceオプションを使用しています。また、OPはPowerShellの新機能であり、gci?%などが理解できないため、エイリアスを使用しないことを選択しました。

$limit = (Get-Date).AddDays(-15)
$path = "C:\Some\Path"

# Delete files older than the $limit.
Get-ChildItem -Path $path -Recurse -Force | Where-Object { !$_.PSIsContainer -and $_.CreationTime -lt $limit } | Remove-Item -Force

# Delete any empty directories left behind after deleting the old files.
Get-ChildItem -Path $path -Recurse -Force | Where-Object { $_.PSIsContainer -and (Get-ChildItem -Path $_.FullName -Recurse -Force | Where-Object { !$_.PSIsContainer }) -eq $null } | Remove-Item -Force -Recurse

もちろん、実際に削除する前にどのファイル/フォルダが削除されるのかを確認したい場合は、両方の行の末尾に-WhatIfスイッチをRemove-Itemコマンドレット呼び出しに追加するだけで済みます。

ここに示されているコードはPowerShell v2.0と互換性がありますが、私はこのコードとより速いPowerShell v3.0コードを 便利な再利用可能な関数として私のブログにも示しています

269
deadlydog

ただ簡単に(PowerShell V5)

Get-ChildItem "C:\temp" -Recurse -File | Where CreationTime -lt  (Get-Date).AddDays(-15)  | Remove-Item -Force
34
Esperento57

もう1つの方法は、現在の日付から15日を引いてCreationTimeをその値と比較することです。

$root  = 'C:\root\folder'
$limit = (Get-Date).AddDays(-15)

Get-ChildItem $root -Recurse | ? {
  -not $_.PSIsContainer -and $_.CreationTime -lt $limit
} | Remove-Item
15
Ansgar Wiechers

基本的には、与えられたパスの下にあるファイルを繰り返し処理し、現在時刻から見つかった各ファイルのCreationTimeを減算し、結果のDaysプロパティと比較します。 -WhatIfスイッチは実際にファイルを削除せずに何が起こるか(どのファイルが削除されるか)を教えてくれます、実際にファイルを削除するにはスイッチを削除してください:

$old = 15
$now = Get-Date

Get-ChildItem $path -Recurse |
Where-Object {-not $_.PSIsContainer -and $now.Subtract($_.CreationTime).Days -gt $old } |
Remove-Item -WhatIf
13
Shay Levy

これを試して:

dir C:\PURGE -recurse | 
where { ((get-date)-$_.creationTime).days -gt 15 } | 
remove-item -force
7
Roland Jansen

Esperento57のスクリプトは、古いバージョンのPowerShellでは機能しません。この例では、

Get-ChildItem -Path "C:\temp" -Recurse -force -ErrorAction SilentlyContinue | where {($_.LastwriteTime -lt  (Get-Date).AddDays(-15) ) -and (! $_.PSIsContainer)} | select name| Remove-Item -Verbose -Force -Recurse -ErrorAction SilentlyContinue
5
KERR

他の選択肢(15. [timespan]に自動的にタイプされる):

ls -file | where { (get-date) - $_.creationtime -gt 15. } | Remove-Item -Verbose
2
js2010
$limit = (Get-Date).AddDays(-15)
$path = "C:\Some\Path"

# Delete files older than the $limit.
Get-ChildItem -Path $path -Force | Where-Object { !$_.PSIsContainer -and $_.CreationTime -lt $limit } | Remove-Item -Force -Recurse

これは古いフォルダとその内容を削除します。

1
Aigar

Windows 10ボックスで上記の例に問題がある場合は、.CreationTime.LastwriteTimeに置き換えてみてください。これは私のために働いた。

dir C:\locationOfFiles -ErrorAction SilentlyContinue | Where { ((Get-Date)-$_.LastWriteTime).days -gt 15 } | Remove-Item -Force
0
Jeff Blumenthal