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


186

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


5
ほとんどの回答はCreationTimeを使用していますが、ファイルがコピーされるとリセットされるため、希望する結果が得られない場合があります。LastWriteTimeは、Windowsエクスプローラの「更新日」に対応するものです。
Roland Schaer

回答:


308

与えられた答えはファイル(確かにこの投稿のタイトルにあるもの)のみを削除しますが、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コードも、ブログで再利用可能な便利な関数として示しています。


22
エイリアスを使用しないでいただきありがとうございます。powershellを初めて使用し、Googleの検索でこの投稿を見つけた人にとっては、あなたの答えが最良だと思います。
Geoff Dawdy 2013年

1
私は@deadlydogの提案を試しましたが、-15または-35を指定しても、ファイルの作成日が数か月(または最近)遡って変化しても、ディレクトリの内容全体が削除されます。
ミケーレ

6
ファイルが使用中の場合は、RemoveItemコマンドに「-ErrorAction SilentlyContinue」を追加することもできます。
Kevin Owen、

17
ありがとう!$ _。CreationTimeの代わりに$ _。LastwriteTimeを使用します
Lauri Lubi

2
このスクリプトの2番目のコマンドは常に、Get-ChildItemがパスの一部を見つけられないというエラーを受け取ります。ディレクトリが見つからないという例外が発生します。それでも問題なく空のフォルダを削除します。作業してもエラーが発生する理由がわかりません。
Nathan McKaskle

51

単に(PowerShell V5)

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

16

別の方法は、現在の日付から15日を差し引きCreationTime、その値と比較することです。

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

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

13

基本的には、指定されたパスの下にあるファイルを反復処理し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

8

これを試して:

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

ラスト-recurseは多すぎると思いますよね?dirリストは再帰的です。アイテムの削除は、子を含めてはいけませんよね?
Joost 2013

作業しているディレクトリが2つのディレクトリの深さである場合、2番目の-recurseが必要です。
ブライアンS.

5

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

1
おかげで、ディレクトリを除外するように回答を更新しました。
KERR 2017年

3

別の代替策(15. [timespan]に自動的に入力されます):

ls -file | where { (get-date) - $_.creationtime -gt 15. } | Remove-Item -Verbose

1
$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

これにより、古いフォルダとそのコンテンツが削除されます。


0

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

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

LastwriteTime同じではありませんCreationTimeLastwriteTimeファイルが変更されるたびに更新されます。
MisterSmith

-1
#----- Define parameters -----#
#----- Get current date ----#
$Now = Get-Date
$Days = "15" #----- define amount of days ----#
$Targetfolder = "C:\Logs" #----- define folder where files are located ----#
$Extension = "*.log" #----- define extension ----#
$Lastwrite = $Now.AddDays(-$Days)

#----- Get files based on lastwrite filter and specified folder ---#
$Files = Get-Children $Targetfolder -include $Extension -Recurse | where {$_.LastwriteTime -le "$Lastwrite"}

foreach ($File in $Files)
{
    if ($File -ne $Null)
    {
        write-host "Deleting File $File" backgroundcolor "DarkRed"
        Remove-item $File.Fullname | out-null
    }
    else
        write-host "No more files to delete" -forgroundcolor "Green"
    }
}

また、空の場合はforeachステートメントに入らないため、elseステートメントに到達する$Filesことはありません。foreachはifステートメントに配置する必要があります。
Dieter

@mati実際には、elseステートメントに到達できます。ファイルリストに基づく同様のforループがあり、$ File変数をnullとして定期的にforループに入ります
BeowulfNode42

たぶん、ここで同じスクリプトに困惑しているだけです。networknet.nl/apps/wp/published/...
Shawson
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.