특정 폴더에서 15 일 이상 전에 작성된 파일 만 삭제하고 싶습니다. PowerShell을 사용하여이 작업을 어떻게 수행 할 수 있습니까?
특정 폴더에서 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
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
당신은 윈도우 10 상자 위의 예에 문제가있는 경우, 교체 시도 .CreationTime
와 함께 .LastwriteTime
. 이것은 나를 위해 일했습니다.
dir C:\locationOfFiles -ErrorAction SilentlyContinue | Where { ((Get-Date)-$_.LastWriteTime).days -gt 15 } | Remove-Item -Force
LastwriteTime
동일하지 않습니다 CreationTime
, LastwriteTime
파일이 수정 될 때마다 업데이트됩니다.
#----- 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"
}
}
$Files
하지 않습니다 . 당신은에 foreach 문을 배치해야 하는 경우 문.