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.