2017-08-08 98 views
0

在我的职业中,我从后来在本地存储中提取的“外来”PC制作法庭图像。使用线程删除具有特定扩展名的文件忽略特定日期的文件

要清理数据,我希望删除所有与我无关的文件。 (不限于:音频,电影,系统文件...) 由于我们讲的是多TB数据,我希望能够使用线程,特别是因为我的存储全部是闪存,磁盘上的限制是问题少一些。

为了在初始手动运行后加快处理速度,我希望脚本排除大于1日的文件(因为我已经通过手动运行完成了那一个)。

是我到目前为止有:

$IncludeFiles = "*.log", "*.sys", "*.avi", "*.mpg", "*.mkv", ".mp3", "*.mp4", 
       "*.mpeg", "*.mov", "*.dll", "*.mof", "*.mui", "*.zvv", "*.wma", 
       "*.wav", "*.MPA", "*.MID", "*.M4A", "*.AIF", "*.IFF", "*.M3U", 
       "*.3G2", "*.3GP", "*.ASF", "*.FLV", "*.M4V", "*.RM", "*.SWF", 
       "*.VOB" 
$ScriptBlock = { 
    Param($mypath = "D:\") 
    Get-ChildItem -Path $mypath -Recurse -File -Include $file | Where-Object { 
     $_.CreationTime -gt (Get-Date).AddDays(-1) 
    } 
    foreach ($file in $IncludeFiles) { 
     Start-Job -ScriptBlock $ScriptBlock -ArgumentList $file 
    } 
    Get-Job | Wait-Job 
    $out = Get-Job | Receive-Job 
    Write-Host $out 

只是不工作的事情是,它只查看文件“年轻化”,比1 天的限制。如果我没有它运行脚本,它似乎完美地工作。 (因为它给我一个带有我想要删除的扩展名的文件列表)

+0

您发布的代码不完整。该脚本块永远不会关闭,'$ file'未定义。另外,将一个命令放在一个scriptblock中并开始工作并不会加速任何事情。您需要拆分该命令,以允许您将耗时的操作同时作为多个作业运行。 –

+0

我想将每个扩展用作一个不同的线程,因为它将搜索所有数据一个扩展名,然后转到下一个。 – Michael

回答

0

参数传递不像你期望的那样工作。 Param($mypath = "D:\")定义了具有默认值D:\的参数mypath。该默认值将被您通过-ArgumentList传递给脚本块的值取代。 scriptblock内的变量$file和scriptblock外的变量$file也不相同。正因为如此调用

Start-Job -ScriptBlock $ScriptBlock -ArgumentList '*.log' 

将运行命令

Get-ChildItem -Path '*.log' -Recurse -File -Include $null | ... 

更改您的代码是这样的,使其工作:

$ScriptBlock = { 
    Param($extension) 
    $mypath = "D:\" 
    Get-ChildItem -Path $mypath -Recurse -File -Filter $extension | Where-Object { 
     $_.CreationTime -gt (Get-Date).AddDays(-1) 
    } 
} 

foreach ($file in $IncludeFiles) { 
    Start-Job -ScriptBlock $ScriptBlock -ArgumentList $file 
} 
Get-Job | Wait-Job | Receive-Job 

使用-Filter应提供better performance-Include,但只接受一个字符串(不是像-Include这样的字符串列表),所以您只能过滤一个扩展名一次。

相关问题