2017-08-08 102 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這樣的字符串列表),所以您只能過濾一個擴展名一次。

相關問題