특정 폴더에서 15 일 이상 전에 작성된 파일 만 삭제하고 싶습니다. PowerShell을 사용하여이 작업을 어떻게 수행 할 수 있습니까?
답변
주어진 답변은 파일 만 삭제하지만 (이 게시물의 제목에 있음) 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 코드 를 내 블로그에서 편리한 재사용 가능한 함수 로 표시 합니다 .
답변
그냥 간단하게 (PowerShell V5)
Get-ChildItem "C:\temp" -Recurse -File | Where CreationTime -lt (Get-Date).AddDays(-15) | Remove-Item -Force
답변
다른 방법은 현재 날짜에서 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