删除文件时获取释放空间

时间:2015-01-20 21:37:38

标签: powershell

我知道我可以使用像

这样的命令以递归方式删除具有特定扩展名的所有文件
get-childitem c:\ -include *.tmp -recurse | foreach ($_) {remove-item $_.fullname}

但是为了在删除文件后检查释放的空间大小,我必须做些什么?

1 个答案:

答案 0 :(得分: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可以帮助但不总是如此。您需要小心运行这样的代码。