Get-ChildItem, список файлов, соответствующих определенным параметрам, а затем Remove-Item

У меня есть следующий скрипт, который отлично работает, перечисляя файлы-кандидаты для удаления. Но я не могу понять, где и как добавить инструкцию Remove-Item для фактического удаления файлов без потери файла экспорта. Кстати, журнал Write-Host не подходит, так как мне нужно записывать размер файлов, время последней записи и т. д. Это должен быть экспорт CSV (как у меня с этим скриптом).

Конечно, я могу повторно запустить Get-ChildItem и вместо этого передать Select-Object, передать Remove-Item, но это означало бы большую потерю времени.

Мой сценарий:

$EXTERNALFILE = "C:\DataCleaning\Scripts\FilesToRemove.txt"
$DESTINATION_DIR = "C:\DataCleaning\Logs\"
$LOGFILECSV = "${DESTINATION_DIR}\Removed_$(Get-Date -f yyyy-MM-dd_hh-mm-ss).csv"

$List = Get-Content $EXTERNALFILE

$REPORT = foreach ($Data in $List) {
    $Data = $Data -split(';')
    $SOURCEDIR = $Data[0]
    $FILTERMASK = $Data[1]
    $RETENTION = (Get-Date).AddMonths(-$Data[2])

    Get-ChildItem -LiteralPath $SOURCEDIR -File -Recurse |
        Where-Object {($_.LastWriteTime –lt $RETENTION) -and ($_.Extension -notmatch $FILTERMASK)} |
        Select-Object FullName, LastWriteTime, CreationTime,
            @{Name="Size (MB)";Expression={[Math]::Round($_.Length /1MB, 2)}},
            @{Name="Age (Days)";Expression={(((Get-Date) - $_.LastWriteTime).Days)}}
}

$REPORT | Export-Csv -Delimiter "|" -NoTypeInformation -Encoding UTF8 -Path $LOGFILECSV

person mundodisco    schedule 23.10.2018    source источник
comment
Имейте в виду, что Remove-Item может использовать переключатель -WhatIf.   -  person lit    schedule 24.10.2018
comment
Да Лит, хороший совет! Параметр -WhatIf чрезвычайно полезен и экономит время! Чего я не знал, так это параметра .FullName после моей переменной $REPORT (когда я ставлю точку, появляется много предложений, но не FullName). (это касается ответа пользователя Nas).   -  person mundodisco    schedule 24.10.2018
comment
Когда вы ставите точку, вы получаете список свойств для $REPORT массива, а не для массива элементов. Мы делаем перечисление членов stackoverflow.com/questions/12131416/   -  person Nas    schedule 24.10.2018


Ответы (1)


Есть несколько решений, что-то прямолинейное:

Remove-Item -Path $REPORT.FullName

Remove-item принимает массив строк для параметра -path

Remove-Item [-Path] <string[]>

Если вы хотите выполнить Remove-Item внутри цикла foreach:

Get-ChildItem -LiteralPath $SOURCEDIR -File -Recurse |
    Where-Object ... |
        ForEach-Object {
            Remove-Item $_
            $_
        } | Select-Object ...
person Nas    schedule 23.10.2018
comment
Итак, Nas, вы предлагаете добавить новую строку после экспорта. Я попробую это и прокомментирую. Но я думал добавить Remove-Item внутри цикла ForEach в виде канала (|) или что-то в этом роде, чтобы элемент (файл) удалялся сразу после индексации (выбора). Я чистый? - person mundodisco; 24.10.2018
comment
Nas, я только что попробовал ваше предложение (Remove-Item -Path $REPORT.FullName), и я могу подтвердить, что оно работает! Чего я не могу понять, так это почему, когда я ставлю точку, FullName не появляется в списке допустимых параметров. - person mundodisco; 24.10.2018
comment
Тем не менее, я все еще хотел бы знать, как правильно вставить Remove-Item внутри цикла, по конвейеру или что-то в этом роде (как я сказал в своем первом комментарии). - person mundodisco; 24.10.2018
comment
Проверьте мой отредактированный пост. Я также добавил комментарий к вашему сообщению относительно вашего другого вопроса. - person Nas; 24.10.2018