Я пишу сценарий PowerShell, который удаляет все, кроме X самых последних папок, за исключением папки с именем Data. Мое заявление, чтобы собрать папки для удаления выглядит так: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
}
Это прекрасно работает, когда я прохожу $numberOfFoldersToKeep
, которое меньше, чем количество папок в исходном каталоге $parentFolderName
. Например, с 5 подкаталогов в моей целевой папке, это работает, как ожидалось:
myScript.ps1 C:\StartingFolder 3
Но если бы я должен был передать большое количество папок пропускаемых, мое заявление, кажется, возвращает значение самого $parentFolderName
! Так что это не будет работать:
myScript.ps1 C:\StartingFolder 15
Поскольку переменный пропуск превышает число элементов в Get-ChildItem
коллекции, скрипт пытается удалить C:\StartingFolder\
, который не был, что я ожидал вообще.
Что я делаю неправильно?
Почему бы не включить ваш foreach в оператор IF: 'if ($ folder1 -neq $ null) {...} ...' или просто использовать 'remove-item $ objectItem.fullname' –
Я не могу воспроизвести это. Если я передаю '$ numberOfFoldersToKeep' с числом, большим, чем результат' gci', переданным через '?', Я возвращаю '$ null' (и поэтому' foreach' даже не выполняется), что точно, что я ожидаю. – alroc
@alroc Посмотрите, как он удаляет файл;) –