【问题标题】:Deleting old files using powershell使用powershell删除旧文件
【发布时间】:2013-08-28 15:10:52
【问题描述】:

大家好,所以我写了这个脚本来自动删除指定文件夹中的文件。

$oldTime = [int]25 # 0 days
$old2Time = [int] 10 
foreach ($path in "C:\Test") {
Write-Host "Trying to delete files older than days, in the folder $path" -    
ForegroundColor Green
# Write information of what it is about to do   
Get-ChildItem $path -Recurse -Include "*.txt", "*.docx", "*.xlsx" #| WHERE    
{($_.CreationTime -le $(Get-Date).AddDays($oldTime))} #| Remove-Item -Recurse -Force}
if ($_.CreationTime -le $(Get-Date).AddDays(-$oldTime)) 
{
Remove-Item -Recurse -Force
}
elseif ($_.CreationTime -le $(Get-Date).AddDays(-$old2Time))
{   
Remove-Item -Recurse -Force
}
}
# deleting the old files

当我只检查一次并删除任何较旧的东西时,它就可以工作。但是现在我希望它检查是否存在任何超过一定天数的文件,然后删除它们。如果不是,则检查超过另一个天数。但是当我运行它时,我在命令管道位置 1 处得到“cmdlet Remove-Item” 为以下参数提供值: 路径[0]:"

有人知道我做错了什么吗?谢谢

【问题讨论】:

    标签: powershell if-statement


    【解决方案1】:

    您正在调用 Remove-Item 但您从未告诉它要删除什么。您需要为其提供要删除的文件的路径/名称。也没有理由使用 -Recurse 参数。

    【讨论】:

    • 嗯,好的。那么我将如何让它删除比那些日子更旧的任何项目。没有指定确切的名称。因为名称并不总是相同的。
    • $_ 变量中有文件对象。我建议使用它。
    • 删除项目 -Path $_.FullName -Force
    • 或者如果工作目录是文件所在的文件夹,那么只需 Remove-Item $_
    • 对不起,我正在学习 powershell,因为我做这个......我厌倦了在“remove-item”之后添加 $_.FullName 但是现在我收到一条错误消息“Remove-Item:无法将参数绑定到参数'Path' 因为它为空。在 C:\Scripts\DelOldFiles.ps1:9 char:13 + Remove-Item
    【解决方案2】:

    我将您的日期范围放在一个数组中,并在这些日子里进行迭代。将您的日期添加到 $dayList 数组,并将您的路径添加到 $paths 数组。这应该可以满足您的需求。

    $daysList = @(25,10)
    $paths = @("C:\Test")
    
    function removeOldItems($days)
    {
        $items = Get-ChildItem $path -Recurse -Include "*.txt", "*.docx", "*.xlsx" | WHERE {($_.CreationTime -le $(Get-Date).AddDays($oldTime))}
        if ($items)
        {
             $items | Remove-Item -Force
        }
        return $items
    }
    
    
    foreach($path in $paths)
    {
        foreach ($days in $daysList)
        {
            Write-Host "Trying to delete files older than $days, in the folder $path" -ForegroundColor Green
            $items = @(removeOldItems($oldTime))
            if (!$items)
            {
                Write-Host "Did not remove anything."
            }
            else
            {
                Write-Host "Removed $($items.Count) items!"
            }
        }
    }
    

    【讨论】:

    • 啊,非常感谢!我现在明白你做了什么。没有意识到powershell有这么复杂。再次感谢!
    • 请注意,$items.Count 将在仅删除 1 项时失败
    • @mhu 更新了答案以安全处理$items.Count。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-16
    • 2011-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多