2014-08-22 1 views
-1

180 일이 지난 하위 디렉토리의 모든 파일 (폴더가 아님)을 삭제할 수 있어야합니다. 유일한 경로는 루트 경로 디렉토리의 파일을 건드리지 않으려는 것입니다.파일 삭제 180 일 이전 루트 경로의 파일 제외

나는 경로가 그래서 경우 : S : \ UserData를 \ 사용자 1 S : \ UserData를 \ 사용자 2 S를 : \ UserData를 \ 사용자 3

나는 사용자 1에있는 파일을 이전 한 후 180 일 삭제하려면

, User2 및 User 3 디렉토리에 있습니다. S : \ UserData에있는 모든 파일을 건 드리면됩니다.

FORFILES를 사용해 보았지만 폴더를 제외하는 명령이없는 것 같습니다.

감사합니다.

+1

지금까지 어떤 코드가 있습니까? –

+0

어떤 버전의 PowerShell을 사용하고 있습니까? – websch01ar

+0

websch01ar에서 암시 하듯이 PS v3 +를 사용하는 경우 파일 만 반환하는 Get-ChildItem의 -File 스위치가 있으며 파일 시스템 공급자의 결과에서 폴더가 제외됩니다. 이것은 Powershell에서의 필터링 ('Where $! PSIsContainer}와 같은)보다 훨씬 빠르지 만 호환성 문제가있을 수 있습니다. – TheMadTechnician

답변

0

DISM은/온라인/정리 - 이미지/SpSupersededTry이에게 아웃 :

[int] $AddDays = -180 
$directories = gci -path "S:\UserData\" -directory 
$directories | % { 
     $files = gci -path $_.fullName -file -Recurse | ? { $_.CreationTime -le (Get-Date).AddDays($AddDays) } 
     $files | Remove-Item -Force -WhatIf #Note that I added WhatIf here for testing! 
    } 
+0

귀하는 180 일 전에 생성되었는지 확인하고 있습니다. 또한 CreationDate는 유효한 속성이 아니며 CreationTime을 사용합니다. – TheMadTechnician

+0

아 ... 내 테스트 케이스에서 저는 -180을 가졌고, 그 값을 유지하고 부정적인 것을 잊어 버리는 변수를 만들기로 결정했습니다. 그리고 CreationTime을 뚱뚱하게 만들었습니다. 나는 편집을했고, 이제는 그들이 원하는대로 작동 할 것이다. – websch01ar

0

가져-ChildItem을 당신이 종류의 루트 폴더를 선언하는 것을 사용하고 아래에 무엇을 얻을 수 있도록 경로의 일부로 와일드 카드를 받아 들인다 그것. 그런 다음 디렉토리를 건너 뛸 위치를 사용할 수 있습니다.

gci 'c : \ dontexist \ user *'-recurse | ? {-not $ _. psiscontainer}

확실히이 테스트를 철저히하고 삭제 작업을 수행하기 전에 원하는 데이터를 대상으로 설정해야합니다. 당신이 그 지점에 도달했을 때 가장 잘 사용할 수있는 것을 잊지 마라.

편집 :

gci 'c:\dontexist\*\*\' -recurse | ? {!$_.psiscontainer -and $_.CreationTime -le (Get-Date).AddDays(-180)} | remove-item -whatif 
+0

왜 나는 downvoted? LOL, OP는 구체적으로 다음과 같이 말했습니다. "S : \ UserData에있는 모든 파일을 수정하지 마십시오." 내 코드는 websch01ar보다 훨씬 효과적이며 OP의 요구 사항을 충족합니다.또한 이전 PS 버전에서는 -directory 스위치를 사용할 수 없었기 때문에 버전 호환이 가능합니다. –

+0

당신은 아마도 당신의 솔루션이 너무 구체적이어서 실용적이지 않기 때문에 당신은 아마도 나 자신이 아니었을 것입니다. User1, User2, User3 및 Public 폴더가 있으면 어떻게됩니까? 귀하의 솔루션은 공용 폴더를 무시합니다. – TheMadTechnician

+0

PowerShell 버전에 대해 묻고 POSH 3.0 답변을했습니다. – websch01ar

0

당신은이 파일 및 루트 드라이브 사이에 적어도 하나 개의 폴더가 있는지 확인하기 위해 전체 이름에 대해 간단한 정규식 일치를 사용할 수 있습니다 덜 구체적이다 또 다른 대답. 이 폴더 아니다,하고 뭔가가 충분히 오래 확인하기 위해 작성 날짜를 확인하고, 파이프는 바로 제거-항목에 있는지 확인하기 위해 !$_.PSIsContainer에 던져

$Path = "S:\UserData" 
$Path = $Path.TrimEnd("\") 
Get-ChildItem $path -recurse| Where{(!$_.PSIsContainer) -and $_.FullName -match "$([regex]::escape($path))\\.+?\\.+" -and $_.CreationDate -le (Get-Date).AddDays(-180)} | Remove-Item 

편집 : 비 작동하도록 업데이트 루트에있는 "루트"폴더를 찾습니다.

+0

GCI에서 -Directory 스위치를 사용하여 디렉토리로만 제한 할 수도 있습니다. – websch01ar

+0

필자는 이전 버전의 PowerShell 버전을 사용하는 사람들을 많이 만났습니다. 당신이 내 대답에 응답 할 때 나는 사실상 메인 포스트에 매우 비슷한 무엇인가로 응답하고 있었고, -file에 대해 설명했다. – TheMadTechnician

+0

나를 위해 일합니다. . . ppl은 POSH imo를 업그레이드해야합니다. 나는 OP가 대답 할 것이라는 희망으로 대답을 게시하기 전에 거의 20 분을 기다렸다. – websch01ar

0

또는 시도해보십시오.

$strRootPath = "S:\UserData" 
$intMaxFileAge = 180 

Foreach ($objFolder in (Get-ChildItem -Path $strRootPath | Where-Object -FilterScript {$_.PsIsContainer -eq $true})) { 
    Get-ChildItem -Path $objFolder.FullName -Recurse -Force | Where-Object -FilterScript {$_.PsIsContainer -eq $false} | ForEach-Object { 
     If (((Get-Date)-($_.CreationTime)).TotalDays -gt $intMaxFileAge) { 
      Remove-Item -Path $.FullName -Force 
     } 
    } 
}