Get-ChildItem,列出符合某些参数的文件,然后删除-Item

时间:2018-10-23 21:23:29

标签: powershell export-to-csv get-childitem select-object

我有以下工作正常的脚本,列出了要删除的候选文件。但是我无法弄清楚在何处或如何添加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

1 个答案:

答案 0 :(得分: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 ...