我的备份一个包含大量(10 000 000 +)小文件的共享存在巨大问题。据我所知,这些文件的总MegaBytes不是那么大,但最大的问题是文件数量。
首先要做的事情: - 分享或多或少"定期"所以有一个根目录,包含30个目录。所有这些第一级目录都包含日期格式为的子文件夹:yyMMdd。
我已经创建了一些PowerShell脚本来根据名称中的日期压缩这些目录,所以,现在,我只在.zip文件上运行备份,但是......
我观察到脚本运行时间每天都在增加(因为这个脚本仍然需要检查所有文件夹)。文件夹数量每天都在增加
我的问题是: 有没有 - 让我们说 - 标记以这种方式使用它: - 当脚本运行并将目录添加到存档时,将今天的文件夹添加为"已经存档",以便在下一个脚本运行中跳过那些已存档的文件夹。
这将给我每天或多或少的脚本运行时间,因为它将是" check&归档"或多或少相同的已经存档的目录数量。
有人可以提一些建议吗?任何的想法?我现在正在跑回选项。
脚本不是非常苛刻的:
$zip = "C:\apps\7-zip\7z.exe"
$days_behind = -1
$folder_data = (Get-Date).AddDays($days_behind).ToString("yyMMdd")
$archive = "X:\SHARE_ARCH\Archive_$folder_data.zip"
$to_zip = (gci X:\SHARE_ROOT -Recurse | ?{ $_.PSIsContainer } | ?{$_.Name -contains ($folder_data)}).FullName
$options = "a", "-tzip", "-y", $archive, $to_zip;
$zip $options;
我认为最有问题的是这一行:
$ to_zip =(gci X:\ SHARE_ROOT -Recurse |?{$ .PSIsContainer} |?{$ .Name -contains($ folder_data)})。FullName
答案 0 :(得分:0)
好的,如果您有PSv3或更高版本,则可以删除$_.PSIsContainer -and
,而是将-Directory
添加到GCI命令,这有助于通过在提供程序级别而不是之后进行过滤来加快速度。
这将阻止它递归所有内容,只会拉出根文件夹中的所有文件夹,并检查它们是否有一个带有所需名称的子文件夹。这应该会大大加快速度。
$zip = "C:\apps\7-zip\7z.exe"
$days_behind = -1
$folder_data = (Get-Date).AddDays($days_behind).ToString("yyMMdd")
$archive = "X:\SHARE_ARCH\Archive_$folder_data.zip"
$to_zip = gci X:\SHARE_ROOT | ?{ $_.PSIsContainer -and (test-path "$_\$folder_data")} | Select -Expand FullName
$options = "a", "-tzip", "-y", $archive, $to_zip
& $zip $options
我还删除了括号并改为使用Select -expand
命令。我不知道它会真正改变速度,但它一般来说更清洁。
答案 1 :(得分:0)
这将消除第二个 where 语句,它应该加快速度:
$to_zip = (gci X:\SHARE_ROOT -Recurse -Include ("*" + $folder_data + "*") | ?{ $_.PSIsContainer }
根据@TheMadTechnician,如果你有PS3 +,你可以使用 -Directory 开关和 gci 来进一步加快速度。稍微左侧的方法是使用旧的命令提示符来获取目录列表并在Powershell中处理它们 - 快得多!试试这个:
$to_zip = (cmd /c "dir X:\SHARE_ROOT /A:D /S /B | findstr /i $folder_data") -split "`n"
让我知道你是怎么过的。