无论内容

时间:2017-02-20 13:18:45

标签: powershell

我有一个目录,它包含许多子目录。例如:“\ IP \ Share \ Directory \ Machine \ Year \ Month \ Date \ Image_ID”

问题是此目录存储图像,我需要删除任何存储时间超过730天的图像。问题是“Image_ID”文件夹上有数百个图像。有时您最多可以创建100个“Image_ID”文件夹。我需要创建一个PowerShell脚本来搜索目录创建日期,排序并将目录壁橱移除到早于730天创建的“IP地址”(不是图像/文件,因为这个过程可能需要一整天)。

这是一项日常任务,我需要尽量减少任务的持续时间。所以我想找到目录日期,而不是文件日期。

这是我正在使用的脚本,对我有用。但它需要很长时间才能完成,它只需多次运行相同的删除行来删除子目录文件夹:

Param (
    [string]$Source = "\IP\Share\Directory\Machine\Year\Month\Date\Image ID",
    [string]$Days = "730"
)


$Folder = Get-ChildItem $Source -Recurse | Where-Object { !$_.PSIsContainer -and $_.LastWriteTime -le (get-date).adddays(-$($Days)) }

$Folder | Remove-Item -Force

$Folder = Get-ChildItem $source -Recurse -Force | Where {$_.PSIsContainer} | Sort-Object FullName -Descending | Where {!(Get-ChildItem $_.FullName -Force)}

$Folder | Remove-Item -Force

$Folder = Get-ChildItem $source -Recurse -Force | Where {$_.PSIsContainer} | Sort-Object FullName -Descending | Where {!(Get-ChildItem $_.FullName -Force)}

$Folder | Remove-Item -Force

$Folder = Get-ChildItem $source -Recurse -Force | Where {$_.PSIsContainer} | Sort-Object FullName -Descending | Where {!(Get-ChildItem $_.FullName -Force)}

$Folder | Remove-Item -Force

$Folder = Get-ChildItem $source -Recurse -Force | Where {$_.PSIsContainer} | Sort-Object FullName -Descending | Where {!(Get-ChildItem $_.FullName -Force)}

$Folder | Remove-Item -Force

stop-process -Id $PID
}

如果我没有正确解释,我会尽力澄清。我是PowerShell的新手,这个脚本是我工作的多个组合。

1 个答案:

答案 0 :(得分:1)

您的代码存在明显问题:

  1. 慢速网络路径的多次枚举
  2. Get-ChildItem为下一个Where中被丢弃的每个文件生成对象,因为自PowerShell 3.0以来您没有指定-Directory参数
  3. 还有已知的问题,Get-ChildItem在网络路径上运行缓慢。
  4. 更有效的方法是使用IO.DirectoryInfo.GetDirectories,因此整个代码将是:

    $DateCutOff = (Get-Date).AddDays(-$Days)
    ([IO.DirectoryInfo]$Source).GetDirectories('*', [IO.SearchOption]::AllDirectories) |
        Where { $_.LastWriteTime -le $DateCutOff } |
        ForEach { $_.Delete($true) } # recursively delete all subdirectories
    

    在ForEach块中使用$_.FullName测试此代码,以便先查看列表并检查它是否正常。

    P.S。在.NET 4和更新的IO.DirectoryInfo.EnumerateDirectories中是更好的选择。