2013-08-28 3 views
0

나는 do while 루프를 사용하여 여러 디렉토리에서 오래된 파일을 제거하려고합니다 (가장 오래된 파일부터 시작). 하나가 남아있을 때까지 프로그램을 종료해야합니다. 런타임에 디렉토리에 둘 이상의 파일이있는 경우에만 프로그램을 실행해야합니다. 여기 Powershell 가장 오래된 항목 제거

내 환경 :

  • 탑 폴더
    • 폴더 1
    • 폴더 2
    • 등 폴더 1, 폴더 2 등이에서

하나의 파일이어야합니다. 스크립트는 거기에 하나의 파일 만 있으면 모든 것을 지우고 아무것도 삭제하지 않아야합니다.

나는 반 완성 다음 코드를 사용하여이있다 : 정확 하나 개 이상의 파일 존재,이 때

$basedir = "C:\Test" 
Set-Location -Path C:\Test 

$a = Get-ChildItem -recurse $basedir 

if ($a.Count -gt 1) { 
    do 
    { 
     $a | Sort-Object LastWriteTime -Descending | Select-Object -Last 1 | remove-item 
    } 
    while 
    (
     $a.Count -gt 1 
    ) 
} 
  1. 그것은 단지 실행됩니다.
  2. 가장 오래된 파일을 올바르게 삭제하지만 디렉토리를 다시 검사하지 않고 동일한 파일을 삭제하려고합니다.
  3. 저는이 시점에서 같은 파일을 반복해서 삭제하려고 시도하는 대신 파일을 삭제 한 후에 루프를 다시 실행하는 데 도움이 필요합니다.

도움을 주셔서 감사 드리며, 이전에 답변을드립니다. 사과드립니다. 나는 많은 수색을했지만 내 상황으로 뭔가를 찾을 수 없었다.

브래드

+0

나는 제안 된대로 다시 형식화했습니다! – MenthoL

답변

0

당신 문제를 해결하려면, 당신은 루프를 통과, 아니면 그냥 전부 $ A를 사용하여 방지하려면 때마다 $를 다시 정의해야합니다. $ a는 개체를 만들 때 거기에 있던 자식 항목이 있기 때문에 변경되지 않습니다.

또 다른 방법은 폴더의 마지막 n-1 개 항목을 선택하는 것입니다.

#Get Items that aren't folders 
$items = Get-ChildItems "c:\test" | ? {!($_.PSIsContainer)} 
#Get a count - this is easier in PoSh 3 
$itemCount = ($items | Measure-Object).Count 

if ($itemCount -gt 1){ 
    $items | Sort-Object LastWriteTime -Descending | Select-Object -Last ($itemCount - 1) | Remove-Item 
} 

재귀 적으로 이렇게하는 것도 매우 쉽습니다. 먼저 우리는 우리가 일을하는 데 필요한 모든 폴더 얻을, 우리는 foreach 루프에 위의 코드를 이동할 수 있습니다 :

$folders = Get-ChildItems "C:\test" -recurse | ? {$_.PSIsContainer} 

foreach ($folder in $folders) { 

    #Get Items that aren't folders 
    $items = Get-ChildItems $folder.FullName | ? {!($_.PSIsContainer)} 
    #Get a count - this is easier in PoSh 3 
    $itemCount = ($items | Measure-Object).Count 

    if ($itemCount -gt 1){ 
     $items | Sort-Object LastWriteTime -Descending | Select-Object -Last ($itemCount - 1) | Remove-Item 
    } 
} 

당신은 뿌리뿐만 아니라 가지 치기 위해 두 스크립트를 실행해야 할 수도 있습니다 foreach 루프 앞에 $folders += Get-Item "C:\test"과 같은 것을 추가하십시오.

+0

죄송 합니다만 한 폴더로 작업 할 때 정답이 맞지만이 스크립트를 재귀 적으로 실행해야한다는 사실을 포함하지 않았습니다. 나는 원래의 질문을 업데이트 할 것이다. – MenthoL

+0

아마도 "X 경로의 각 폴더에 대해"어떤 종류가 필요합니까? – MenthoL

+0

질문을 업데이트하면 내 대답이 업데이트됩니다. –

관련 문제