2016-10-28 5 views
0

현재 PowerShell을 처음 사용하고 있으며 LastWriteTime이 1 미만인 폴더에서 찾은 파일에 대해 삭제 작업을 수행 할 수있는 수집 된 정보를 기반으로 스크립트를 만들었습니다 일. 나는 -WhatIf 명령을 알고 지금까지Windows PowerShell - X 일보다 오래된 파일 삭제

$timeLimit = (Get-Date).AddDays(-1) 
$oldBackups = Get-ChildItem -Path $dest -Recurse -Force -Filter "backup_cap_*" | 
       Where-Object {$_.PSIsContainer -and $_.LastWriteTime -lt $timeLimit} 

foreach($backup in $oldBackups) 
{ 
    Remove-Item $dest\$backup -Recurse -Force -WhatIf 
} 

것이다 명령이 실제 시나리오에서 할 "해야"무엇을 콘솔에 출력 :

현재 스크립트는 다음과 같다. 문제는 -WhatIf이 아무 것도 출력하지 않으며 제거하더라도 파일이 예상대로 삭제되지 않는다는 것입니다.

서버가 Windows 2012 R2이고 명령이 PowerShell ISE V3에서 실행되고 있습니다.

명령이 작동하면 다른 작업이 일부 작업을 완료 한 후 매일 밤마다 실행되는 작업으로 "변환"됩니다.

+0

2) 당신이 파일을 삭제하려면 필요합니다? 3) 그것이 스크립트라면, $ dest는 어디서 오는가? 정의되어 있지 않으면 gci는 오류없이 현재 작업 디렉토리를 읽습니다. 4)'$ oldBackups'에 아무 것도 없다는 것을 확인 했습니까? 5) Remove-Item은 존재하지 않는 파일에 대한 예외를 던집니까? – TessellatingHeckler

+0

$ dest가 외부 범위에서 위에 선언되었습니다. 스크립트의 작업 디렉토리입니다. 거기에 백업이 생성됩니다. 그리고 아니오, 아무 예외도 던지지 않는다. $ PSIsContainer에 관해서는 당신이 옳습니다. 우리는 백업이 폴더에 있지 않을 것이라고 결정했습니다, 그들은 Working Directory에 직접있을 것이므로, 기본적으로 백업은 mysqldump에 의해 출력되는 backup_cap_dateOfWrite 패턴 아래있을 것입니다. – darksleep

답변

2

나는이 나를 위해 일한 파이프

Get-ChildItem C:\temp | ? { $_.PSIsContainer -and $_.LastWriteTime -lt $timeLimit } | Remove-Item -WhatIf 

에 그것을했다. 따라서 파일의 올바른 경로를 관리 할 필요가 없습니다.

1

원래 문제가 $dest\$backup 각 파일은 루트 폴더 있다는 가정 것이었다

$timeLimit = (Get-Date).AddDays(-1) 
Get-ChildItem C:\temp2 -Directory | where LastWriteTime -lt $timeLimit | Remove-Item -Force -Recurse 
0

다른 솔루션입니다. 그러나 속성을 $backup에 사용하면 정적으로 디렉토리를 정의 할 필요가 없습니다.

또 다른 참고는 제거 품목은 문자열의 배열을합니다, 그래서 당신은 또한 파이프 라인을 사용하지 않고, 여기에 귀하의 스크립트에 수정 년대 foreach

제거 할 수있다. 왜 당신은`$ PSIsContainer`과 폴더를 포함하는, 나는 where 방법을 사용하기 때문에이 적어도 버전 4

$timeLimit = (Get-Date).AddDays(-1) 
$Backups = Get-ChildItem -Path $dest -Directory -Recurse -Force -Filter "backup_cap_*" 
$oldBackups = $backups.where{$_.LastWriteTime -lt $timeLimit} 
Remove-Item $oldBackups.fullname -Recurse -Force -WhatIf