PowerShell Get-ChildItem и Пропустить

Я пишу сценарий PowerShell, который удаляет все, кроме X самых последних папок, за исключением папки с именем Data. Моя инструкция по сбору папок для удаления выглядит следующим образом:

$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
}

Это прекрасно работает, когда я прохожу $numberOfFoldersToKeep это меньше, чем количество папок в начальном каталоге $parentFolderName, Например, с 5 подкаталогами в моей целевой папке, это работает как ожидалось:

myScript.ps1 C:\StartingFolder 3

Но если я пропущу большое количество папок, чтобы пропустить, мое утверждение, кажется, возвращает значение $parentFolderName сам! Так что это не сработает:

myScript.ps1 C:\StartingFolder 15

Поскольку переменная пропуска превышает количество элементов в Get-ChildItem коллекция, скрипт пытается удалить C:\StartingFolder\ это было совсем не то, что я ожидал.

Что я делаю неправильно?

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
    }
    }

Я дал @CB кредит за ответ, но есть и другой способ решить проблему, форсировать вывод 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
}

Это возвращает массив нулевой длины, поэтому тело оператора foreach не выполняется.

Как отметил CB в комментариях выше, проблема в том, что если вы передадите null При сборе в оператор foreach в PowerShell тело оператора foreach выполняется один раз.

Это было совершенно не интуитивно для меня, исходя из фона.NET. По-видимому, это не интуитивно понятно и многим другим людям, поскольку есть сообщения об ошибках, поданных для этого поведения на MSDN: https://connect.microsoft.com/feedback/ViewFeedback.aspx?FeedbackID=281908&SiteID=99

По-видимому, эта ошибка была исправлена ​​в PowerShell V3.

Другие вопросы по тегам