Как удалить пустые подпапки с PowerShell?

Если [super init] возвращает nil, это означает, что вы были освобождены, и ваш параметр self теперь является недействительным указателем. Слепо следуя соглашению self = [super init], вы избавите себя от потенциально неприятных ошибок.

Рассмотрим следующий нестандартный инициализатор:

- (id)initWithParam:(id)param {
    if (!param) {
        // Bad param.  Abort
        self = [super init]; // What if [super init] returns nil?
        [self release];
        return nil;
    }
    else 
    {
        // initialize with param.
        ...
    }
}

Что теперь произойдет, если мой суперкласс решит прервать и вернуть nil? Я был удален, и мой параметр self теперь недействителен, и [self release] вылетит. Переназначая self, я избегаю этого сбоя.

28
задан tshepang 23 August 2014 в 21:44
поделиться

2 ответа

Я бы сделал это в два прохода - сначала удалив старые файлы, а затем пустые каталоги:

Get-ChildItem -recurse | Where {!$_.PSIsContainer -and `
$_.LastWriteTime -lt (get-date).AddDays(-31)} | Remove-Item -whatif

Get-ChildItem -recurse | Where {$_.PSIsContainer -and `
@(Get-ChildItem -Lit $_.Fullname -r | Where {!$_.PSIsContainer}).Length -eq 0} |
Remove-Item -recurse -whatif

Этот тип операции демонстрирует возможности вложенных конвейеров в PowerShell, которые второй набор команд демонстрирует. Он использует вложенный конвейер для рекурсивного определения, есть ли в каком-либо каталоге нулевые файлы.

43
ответ дан 28 November 2019 в 02:52
поделиться

Чтобы удалить файлы старше 30 дней:

get-childitem -recurse |
    ? {$_.GetType() -match "FileInfo"} |
    ?{ $_.LastWriteTime -lt [datetime]::now.adddays(-30) }  |
    rm -whatif

(Просто удалите -whatif для фактического выполнения.)

Затем введите:

 get-childitem -recurse |
     ? {$_.GetType() -match "DirectoryInfo"} |
     ?{ $_.GetFiles().Count -eq 0 -and $_.GetDirectories().Count -eq 0 } |
     rm -whatif
2
ответ дан 28 November 2019 в 02:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: