Skip to main content

Use PowerShell to see how much file space on the hard drive is unusable because of the block size.

Modern hard drives are divided into blocks.  These blocks can be of various sizes.  512K, 1024K.  The issue that can develop is that once a block contains the data of a file, the unused portion of that block cannot store an other data.  So for example, if you save a 768K file onto a hard drive containing 512K blocks, your file will consume 1024K.  256K will be unusable space.  This script will show you how much space is being wasted.

 

This script is a quick demo based on a question that popped up in class.  Utilizing FRSM quotas, I set a folder with a hard quota of 6KB.  I then copied a file of 2KB into the folder.  When I copied the same file in again, Windows stated that I exceeded my quota.  Well, logically 2 KB + 2 KB = 4 KB.  My quota was 6 KB.

Upon further analysis, we discovered that the file size was actually a few kilobytes larger than 2.5 K.  That means that on my hard drive with block sizes of 512K, we were using 6 blocks or 3 KB.  The second file fit the limit and we received an error.

 

This script is designed to be dot sourced into the shell environment of PowerShell.

  

<#
.SYNOPSIS
Returns the amount of space that is unused in the files blocks.

.DESCRIPTION
Returns the amount of space that is not available to be
used on the hard drive due to the blocki size on the hard drives.
If a file only uses part of a block, the rest of the block cannot
be used for another file.

.PARAMETER Recurse
Performs a recursive search using the current location
in the file system as the root.

.EXAMPLE
Get-WastedSpace -Recurse

Returns the wasted space on the hard drive based on the
current location in the file system as the root of the search.
#>

function Get-WastedDriveSpace
{
Param
(
[
Switch]$Recurse
)

# Get the Disk Partition information
$DiskPartition = Get-WmiObject Win32_DiskPArtition |
Select-Object -Property BlockSize

# Get the logical disk information
$LogicalDisk = Get-WmiObject Win32_LogicalDIsk |
Select-object -Property Name

If ($Recurse)
{
$Files = Get-ChildItem -Recurse |
Select-Object -Property length, PSDrive

}
Else
{
$Files = Get-ChildItem |
Select-Object -Property length, PSDrive
}


$DriveObj = @()
$Counter = 0
forEach ($Disk in $LogicalDisk)
{
$DriveInfo = New-Object PSObject
$DriveInfo | Add-Member NoteProperty -Name Name -Value ($Disk.Name).Replace(":","")
$DriveInfo | Add-Member NoteProperty -Name BlockSize $DiskPartition[$Counter].BlockSize
$DriveInfo | Add-Member NoteProperty -Name TotalFileSize -Value 0
$DriveInfo | Add-Member NoteProperty -Name TotalBlocksUsed -Value 0
$DriveInfo | Add-Member NoteProperty -Name SizeOfBlocks -value 0
$DriveInfo | Add-Member NoteProperty -Name WastedSpaceMB -Value 0

$DriveObj += $DriveInfo
$Counter++

}
# End: for Each ($File in $Files)

ForEach ($File in $Files)
{

ForEach ($Drive in $DriveObj)
{

If ($File.PSDrive -like $Drive.Name)
{
$Drive.TotalFileSize += $File.Length
$Drive.TotalBlocksUsed += [int]($File.Length/$Drive.BlockSize)
$Drive.SizeOfBlocks += ($Drive.TotalBlocksUsed * $Drive.BlockSize)


}
}
# End: ForEach ($Drive in $DriveObj)

}
# End: ForEach ($File in $Files)

# Calculate the Wasted Space.
ForEach ($Drive in $DriveObj)
{
$Drive.WastedSpaceMB = ($Drive.SizeOfBlocks - $Drive.TotalFileSize) / 1mb

}
# End: ForEach ($Drive in $DriveObj)

# Write the object to the pipline
Write-Output $DriveObj
}
# End: Get-WastedDriveSpace

Comments

Popular posts from this blog

Sticky Key problem between Windows Server 2012 and LogMeIn

This week I instructed my first class using Windows Server 2012 accessed via LogMeIn and discovered a Sticky Key problem every time you press the Shift key. Here is my solution to resolve this.  First off, in the Preferences of LogMeIn for the connection to the Windows Server, click General . Change the Keyboard and mouse priority to Host side user and click Apply at the bottom. On the Windows 2012 server, open the Control Panel – Ease of Access – Change how your keyboard works . Uncheck Turn on Sticky Keys . Click Set up Sticky Keys . Uncheck Turn on Sticky Keys when SHIFT is pressed five times . Click OK twice. If you are using Windows Server 2012 as a Hyper-V host, you will need to redo the Easy of Use settings on each guest operating system in order to avoid the Sticky Key Problem. Updated Information: March 20, 2013 If you continue to have problems, Uncheck Turn on Filter Keys .

Where did a User’s Account Get Locked Out?

Updated: May 15, 2015 When this article was originally published, two extra carriage returns were add causing the code to malfunction.  The code below is correct.   My client for this week’s PowerShell class had a really interesting question. They needed to know where an account is being locked out at. OK, interesting. Apparently users hop around clients and forget to log off, leading to eventual lock out of their accounts. The accounts can be unlocked, but are then relocked after Active Directory replication. This problem is solved in two parts. The first one is to modify the event auditing on the network. The second part is resolved with PowerShell. The first part involves creating a group policy that will encompass your Domain Controllers. In this GPO, make these changes. Expand Computer Configuration \ Policies \ Windows Settings \ Security Settings \ Advanced Audit Policy Configuration \ Audit Policies \ Account Management Double click User Account Management C...

Backup and Restore AD LDS with DSDBUTIL.exe

Active Directory Lightweight Directory Services allow you to create a directory service that allows applications to have access to user accounts, groups, and authentication similar to Active Directory Domain Services.  The big advantage here is that the schema of the directory service will not be bound by the rules of an Active Directory database.  Exchange 2007/2010, for example, use an instance of AD LDS on the Edge Transport Server to provide for user authentication from the internet.  Because your Active Directory database is not exposed to the internet, this is more secure. Applications will handle most of the dirty work should they require AD LDS.  You may want to make sure the database is being backed up and also have a restore plan in place.  Should the database become corrupt, the application that uses that database will fail.  This document will walk you through backing up and restoring an instance of AD LDS using the dsdbutil.exe command. Fi...