特定のフォルダに15日以上前に作成されたファイルのみを削除したいです。 PowerShellを使ってこれを行うにはどうすればよいですか。
与えられた答えはファイルを削除するだけです(確かにこの記事のタイトルにあるものです)、ここで最初に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コードを 便利な再利用可能な関数として私のブログにも示しています 。
ただ簡単に(PowerShell V5)
Get-ChildItem "C:\temp" -Recurse -File | Where CreationTime -lt (Get-Date).AddDays(-15) | Remove-Item -Force
もう1つの方法は、現在の日付から15日を引いてCreationTime
をその値と比較することです。
$root = 'C:\root\folder'
$limit = (Get-Date).AddDays(-15)
Get-ChildItem $root -Recurse | ? {
-not $_.PSIsContainer -and $_.CreationTime -lt $limit
} | Remove-Item
基本的には、与えられたパスの下にあるファイルを繰り返し処理し、現在時刻から見つかった各ファイルの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
これを試して:
dir C:\PURGE -recurse |
where { ((get-date)-$_.creationTime).days -gt 15 } |
remove-item -force
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
他の選択肢(15. [timespan]に自動的にタイプされる):
ls -file | where { (get-date) - $_.creationtime -gt 15. } | Remove-Item -Verbose
$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
これは古いフォルダとその内容を削除します。
Windows 10ボックスで上記の例に問題がある場合は、.CreationTime
を.LastwriteTime
に置き換えてみてください。これは私のために働いた。
dir C:\locationOfFiles -ErrorAction SilentlyContinue | Where { ((Get-Date)-$_.LastWriteTime).days -gt 15 } | Remove-Item -Force