2015-01-20 90 views
0

當我知道我可以遞歸使用像刪除文件

get-childitem c:\ -include *.tmp -recurse | foreach ($_) {remove-item $_.fullname} 

命令,但刪除特定擴展名的文件獲得釋放的空間是我必須先刪除文件後檢查釋放的空間大小呢?

+3

獲取上述之前的磁盤空間量,運行上面的,然後獲取磁盤空間量之後。從第一個減去第二個數字。 – 2015-01-20 22:00:21

+0

這將是最準確的方法。在循環中,您已經可以訪問文件大小(該屬性爲'length'),因此您可以將其添加到循環中,只需要一次循環。但是如果一個文件沒有被刪除,那麼你將不得不添加邏輯來解釋這種可能性,並且它會讓條例草案更適合。 – Matt 2015-01-20 22:17:20

+0

如果你想知道被刪除後釋放的磁盤空間量,我會在被刪除的文件被刪除之前總結它們的長度。在您執行刪除操作前後,檢查磁盤可用空間不會考慮可能正在添加或刪除文件的任何其他進程。如果有一些其他進程在創建大文件的同時運行,則可以運行刪除操作,並報告您實際上丟失了磁盤可用空間。 – mjolinor 2015-01-20 23:13:18

回答

1

有幾種方法可以實現這一點。您可以在代碼之前和之後使用WMI並檢查差異。這可以被認爲是一種更簡單的方法。

$freeBefore = Get-WmiObject Win32_LogicalDisk -Filter "DeviceID='C:'" | Select-Object -Expand FreeSpace 
...your code... 
$freeAfter = Get-WmiObject Win32_LogicalDisk -Filter "DeviceID='C:'" | Select-Object -Expand FreeSpace 

"Reclaimed {0:N4} MB of space" -f (($freeAfter - $freeBefore)/1MB) 

在上面的例子中我已硬編碼C:驅動器作爲DeviceID。這種方法的一個警告是,空間將取決於當時的所有計算機操作,而不僅僅是您自己的操作。與您正在做的事無關的大文件轉儲會歪曲數字。

另一個想法是計算變化的大小,你正在處理的數據,因爲你已經獲得了$file.length(以字節爲單位)

$total = 0 
$size = 0 

Get-ChildItem $path -Recurse -Include *.txt | ForEach-Object{ 
    $size = $_.length 
    "Before $size" 
    Try{ 
     Remove-Item $_.FullName 
     $total += $size 
    } Catch { 
     "Could not remove $($_.FullName)" 
    } 
} 

"Reclaimed {0:N4} MB of space" -f ($total/1MB) 

後者的代碼有其缺點。一個是,這將報告文件內容的大小,但在磁盤上的大小將略大於較小的文件。如果你有1000個tmp文件只佔用10個字節,那麼文件數據將比磁盤上的大小小得多,每個文件大小爲4KB。

無論哪種情況,您都應該考慮錯誤,因爲整個本地磁盤上的文件尤其可能存在這種錯誤。 Tmp文件可能會被無法刪除的程序打開。 -Force可以幫助但不總是。你需要小心像這樣運行代碼。

+0

即使不太精確,我更喜歡第二種解決方案。 Windows機器是一個服務器,可以在其他用戶的其他位置添加/刪除文件,因此刪除後可用空間的大小可能包含其他操作,而我可以檢查刪除的文件的大小。 – Jepessen 2015-01-21 08:39:09