2010-01-05 5 views

답변

15

데이터 :

-- begin exclusions.txt -- 
a.txt 
b.txt 
c.txt 
-- end -- 

코드 : 당신이 당신의 결과에 만족하는 경우

# read all exclusions into a string array 
$exclusions = Get-Content .\exclusions.txt 

dir -rec *.* | Where-Object { 
    $exclusions -notcontains $_.name } | ` 
    Remove-Item -WhatIf 

-WhatIf 스위치를 제거합니다.

Get-ChildItem -exclude (gc exclusions.txt) | Remove-Item -whatif 

이 방식은 가정 -WhatIf는 파일이 현재 폴더에 존재하는 경우이 작업을 수행 할 수 있습니다

-Oisin

+3

나는 그것을 좋아한다. 왜, -notcontains를 사용하지 않을까요? –

+0

감사합니다. 이것은 나를 위해 완벽하게 작동합니다. Mike가 제안한대로 Notcontains를 시도했지만 결과는 동일합니다. – Mrchief

+0

나는 싫어한다. 아니, 농담이야. 그래, 그건 더 간결 해. – x0n

7

DO (즉이 삭제되지 않습니다) 것이 무엇을 보여줍니다 각 파일은 별도의 행에 있습니다. 파일이 하위 폴더에 있으면 Oisin의 접근 방식을 사용합니다.

+0

예, 파일은 별도의 줄에 있습니다. 답변 주셔서 감사합니다. 부모 위치에 하위 폴더가있는 경우 "Microsoft.PowerShell.Core \ FileSystem :: <> 항목에 하위 항목이 있고 Recurse 매개 변수가 지정되지 않았습니다.라는 메시지가 나타납니다. 계속하면 모든 하위 항목이 계속 하시겠습니까? " 아마도 -recurse 스위치를 추가하면 문제가 해결 될 것입니다. Oisin의 방법으로는이 메시지가 표시되지 않습니다. – Mrchief

+3

하위 디렉토리가 관련되어 있다면 내 접근 방식을 사용하지 않고 -r을 사용하지 않으려 고합니다. 그렇지 않으면 전체 폴더가 삭제됩니다. –

1

실제로 이것은 재귀가 아닌 첫 번째 디렉토리에서만 작동하는 것처럼 보입니다. 변경된 스크립트가 올바르게 재귀됩니다.

$exclusions = Get-Content .\exclusions.txt 

dir -rec | where-object {-not($exclusions -contains [io.path]::GetFileName($_))} | ` 
where-object {-not($_ -is [system.IO.directoryInfo])} | remove-item -whatif 
+0

[io.path] :: GetFileName ($ _) 대신 $ _. FullName.ToLower()를 사용하고 내 제외 목록에서 전체 경로 이름을 사용하여 재귀가 작동하도록했습니다. – toxaq

관련 문제