Any Windows system administrator frequently has to find out why a disk is full and my favourite tool for this is Windirstat. Unfortunately Windirstat does not easily allow you to export the results to a CSV file for analysis.
I intend to import the CSV file into Excel and then create a pivot table that I can use to give me summary information such as,
- directory sizes
- biggest files
- size by file type (there will be videos…)
- date file created
- …
Once the data is in Excel I can also add extra columns such as “Archive or Delete” and do “what if” analysis.
As soon as you try to get this information at the command prompt you quickly run up against the problem that Windows does not report directory sizes and the standard listing “dir /s” is unsuitable for creating a CSV file. However after a bit of Googling and some debugging (yes, some users do put commas in file names) I have written a batch file that creates a suitable CSV file.
It returns quickly on small directories and takes about an hour a Terabyte on larger drives (your mileage may vary). I recommend that you open taskmgr.exe and look the CPU and RAM use and periodically check the job while you do something else. Ideally someone (not me) should restructure the main loop into a loop per directory. This would reduce memory load and allow a progress indicator during the file enumeration. Feel free to have a go.
@echo off
echo ------------------------------------------------------------------------------
echo((c) james@elephantpm.com MIT Licence)
echo This script generates a CSV file containing information about each file that
echo is suitable for analysis in Excel.
echo ------------------------------------------------------------------------------
echo
SETLOCAL ENABLEDELAYEDEXPANSION
echo I am now recursively listing every file in this directory and its size into a
echo csv file. This may take some time
echo FULLPATH,DIRECTORY,FILENAME,SIZE,FILEDATE,DATE,DIME,YEAR,MONTH,DAY,HOUR,MINUTE,ATTRIBUTES,EXTENSION,LEVEL01,LEVEL02,LEVEL03,LEVEL04,LEVEL05,LEVEL06,LEVEL07,LEVEL08,LEVEL09,LEVEL10 > FILES-AND-SIZES.CSV
rem http://superuser.com/questions/653860/list-files-recursively-showing-only-full-path-and-file-size-from-windows-command
rem set /a for numerical values
set /a "count=100"
@echo off & for /f "delims=*" %%A in ('dir /s /b /a:-d') do (
rem output a "." to screen every 100th file
set /a "count+=1"
set "lastDigitOfCount=!count:~-2!"
if !lastDigitOfCount! == 00 (<nul (set /p junk=.))
rem now write the data to file
set "size=%%~zA"
set "extension=%%~xA"
rem next escape commas in the file name to create a csv list of directories
set "fullPathToFileIncludingName=%%~fA"
set "noCommasInFullPath=!fullPathToFileIncludingName:,=this is the substitution text for comma!"
rem next create a set of quoted comma separated strings for each directory name
set "csvPath="!noCommasInFullPath:\=","!""
rem next put the comma back
set "csvPath1=!csvPath:this is the substitution text for comma=,!"
rem next file name
set "fileName=%%~nA!extension!"
rem next get directory
set "directory=%%~pA"
rem next make nice date data for sorting and filtering
set "dateTime=%%~tA"
set "dateTimeDay=!dateTime:~0,2!"
set "dateTimeMonth=!dateTime:~3,2!"
set "dateTimeYear=!dateTime:~6,4!"
set "dateTimeHour=!dateTime:~11,2!"
set "dateTimeMinute=!dateTime:~-2!"
set "dateOnly=!dateTimeYear!/!dateTimeMonth!/!dateTimeDay!"
set "timeOnly=!dateTime:~11,5!
set "attributes=%%~aA"
rem to force loop-time evaluation of the variable we had to enable SETLOCAL on line 1 above see http://www.robvanderwoude.com/variableexpansion.php
rem note how all string fields are quoted as required by the CSV specification
echo "!fullPathToFileIncludingName!","!directory!","!filename!", !size!,"!dateTime!","!dateOnly!","!timeOnly!",!dateTimeYear!,!dateTimeMonth!,!dateTimeDay!,!dateTimeHour!,!dateTimeMinute!,"!attributes!","!extension!", !csvPath1! >> files-and-sizes.csv
)
echo DONE!!!!!!!!!!!!!!!!!!!!!
echo Open files-and-sizes.csv in Excel and insert a table. You may add additional columns for
echo filtering or other purposes for example I usually add "Size in MB". Click in
echo your new table and insert a pivot table. My default setting are
echo Report Filter: Extension
echo Row Labels: LEVEL01,...,LEVEL10
echo Values: Sum of Size
echo This pivot table will show you sizes of each directory.
ENDLOCAL
Here are some examples of reports in Excel


