PowerShell을 사용하여 15 일이 지난 파일 삭제


186

특정 폴더에서 15 일 이상 전에 작성된 파일 만 삭제하고 싶습니다. PowerShell을 사용하여이 작업을 어떻게 수행 할 수 있습니까?


5
대부분의 답변은 CreationTime을 사용하지만 파일을 복사하면 재설정되므로 원하는 결과를 얻지 못할 수 있습니다. LastWriteTime은 Windows 탐색기의 "날짜 수정"에 해당합니다.
Roland Schaer

답변:


308

주어진 답변은 파일 만 삭제하지만 (이 게시물의 제목에 있음) 15 일 이전의 모든 파일을 먼저 삭제 한 다음 남아있을 수있는 빈 디렉토리를 재귀 적으로 삭제하는 코드가 있습니다. 뒤에. 내 코드는 -Force옵션을 사용하여 숨김 및 읽기 전용 파일도 삭제합니다. 또한, 나는 영업 이익은 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 두 줄의 끝에서 cmdlet 호출에 됩니다.

여기에 표시된 코드는 PowerShell v2.0과 호환되지만이 코드와 더 빠른 PowerShell v3.0 코드 를 내 블로그에서 편리한 재사용 가능한 함수 로 표시 합니다 .


22
별칭을 사용하지 않아서 감사합니다. Powershell을 처음 사용하고 Google 검색을 통해이 게시물을 찾은 사람에게는 귀하의 답변이 최고라고 생각합니다.
Geoff Dawdy

1
@deadlydog의 제안을 시도했지만 몇 달 (또는 최근)에 다양한 파일 작성 날짜로 -15 또는 -35를 지정하더라도 디렉토리의 전체 내용을 삭제합니다.
Michele

6
파일이 사용 중일 경우 RemoveItem 명령에 "-ErrorAction SilentlyContinue"를 추가하는 것도 좋습니다.
Kevin Owen

17
감사! 나는 _ $를 사용 LastwriteTime 대신 $의 _ CREATIONTIME..
라 우리 Lubi

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

작업중 인 디렉토리가 두 개의 디렉토리 인 경우 두 번째-반복이 필요합니다.
Bryan 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

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

당신은 윈도우 10 상자 위의 예에 문제가있는 경우, 교체 시도 .CreationTime와 함께 .LastwriteTime. 이것은 나를 위해 일했습니다.

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

LastwriteTime동일하지 않습니다 CreationTime, LastwriteTime파일이 수정 될 때마다 업데이트됩니다.
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 문을 배치해야 하는 경우 문.
Dieter

@mati는 실제로 else 문에 도달 할 수 있습니다. 파일 목록을 기반으로 유사한 for 루프가 있으며 $ File 변수를 사용하여 for 루프를 정기적으로 입력합니다.
BeowulfNode42

나는 여기에서 같은 스크립트를 보았을 것 같아요. networknet.nl/apps/wp/published/…
Shawson
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.