2013-07-01 2 views
2

Data라는 폴더를 제외한 가장 최근의 X 폴더를 제외한 모든 PowerShell 스크립트를 삭제합니다. 내 문은 다음과 같습니다를 삭제하려면 폴더를 수집합니다 : 나는 시작 디렉토리 $parentFolderName의 폴더의 수보다 적은 수있는 $numberOfFoldersToKeep을 통과 할 때이 위대한 작품을PowerShell Get-ChildItem 및 Skip

$folders1 = Get-ChildItem $parentFolderName | 
    ? { $_.PSIsContainer -and $_.Name -ne "Data" } | 
    sort CreationTime -desc | 
    select -Skip $numberOfFoldersToKeep 

foreach ($objItem in $folders1) { 
    Write-Host $webServerLocation\$objItem 
    Remove-Item -Recurse -Force $parentFolderName\$objItem -WhatIf 
} 

.

myScript.ps1 C:\StartingFolder 3 

을하지만 건너 뛸 폴더의 높은 숫자를 전달한다면, 내 문은 $parentFolderName 자체의 값을 반환하는 것 같다 예를 들어, 내 대상 폴더에 5 개 하위 디렉토리와이 예상대로 작동합니다! 그래서이 작동하지 않습니다 건너 뛰기 변수가 Get-ChildItem 컬렉션의 항목 수를 초과

myScript.ps1 C:\StartingFolder 15 

때문에, 스크립트는 내가 전혀 기대했던 아니었다 C:\StartingFolder\을 삭제하려고합니다.

내가 뭘 잘못하고 있니?

+1

왜 foreach를 IF 문으로 묶지 않을까요? if ($ folder1 -neq $ null) {...} ... '또는 단순히'remove-item $ objectItem.fullname'을 사용하십시오 –

+0

재현 할 수 없습니다 이. '$ numberOfFoldersToKeep'을'? '를 통해 파이프 된'gci' 결과보다 큰 수로 전달하면'$ null'이 리턴됩니다 (따라서'foreach'도 실행되지 않습니다). 정확히 내가 기대했던 것. – alroc

+0

@alroc 그가 파일을 어떻게 제거하는지보십시오.) –

답변

2

이 시도 :

$folders1 = Get-ChildItem $parentFolderName | 
    ? { $_.PSIsContainer -and $_.Name -ne "Data" } | 
    sort CreationTime -desc | 
    select -Skip $numberOfFoldersToKeep 
    if ($folder1 -neq $null) 

{ 

foreach ($objItem in $folders1) { 


     Write-Host $($objItem.fullname) 




Remove-Item -Recurse -Force $objItem.fullname -WhatIf 
    } 
    } 
+0

그 null 테스트가 중요합니다! 당신의 도움을 주셔서 감사합니다. foreach에 전달 된 콜렉션이 null 인 경우 foreach의 본문이 실행될 것이라는 것을 전혀 알지 못했습니다. – dthrasher

+0

버그로 간주됩니다. 질문에 대한 마지막 코멘트를 읽으십시오. –

1

나는 C.B @했다. 이 질문에 대한 답을 찾을 수는 있지만 @(...) 구문을 사용하여 Get-ChildItem의 출력을 배열에 강제로 저장함으로써 문제를 해결할 수있는 또 다른 방법이 있습니다.

$folders1 = @(Get-ChildItem $parentFolderName | 
    ? { $_.PSIsContainer -and $_.Name -ne "Data" } | 
    sort CreationTime -desc | 
    select -Skip $numberOfFoldersToKeep) 

foreach ($objItem in $folders1) { 
    Write-Host $webServerLocation\$objItem 
    Remove-Item -Recurse -Force $parentFolderName\$objItem -WhatIf 
} 

이렇게하면 길이가 0 인 배열이 반환되므로 foreach 문의 본문이 실행되지 않습니다. C.B. 위의 댓글에서 언급 한 바와 같이

, 문제는 PowerShell을 에서 foreach 문에 null 수집을 통과하면 foreach 문의 몸이 한 번 실행되는 것입니다.

이것은 .NET 배경에서 나에게 완전히 직관적이지 않았습니다. MSDN에서이 문제에 대해 제기 된 버그 보고서가 있기 때문에 외관상으로는 다른 많은 사람들에게도 직관적이지 않습니다. https://connect.microsoft.com/feedback/ViewFeedback.aspx?FeedbackID=281908&SiteID=99

분명히이 버그는 PowerShell V3에서 수정되었습니다.