<?xml version="1.0" encoding="UTF-8"?>
<job>
<runtime>
<description>
EraseFreeSpace.wsf
A script that fills a drive with blank files to overwrite all the free space.
Copyright (C) 2005  Shailesh N. Humbad https://www.somacon.com/ 

This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.
http://www.gnu.org/copyleft/gpl.html

SYSTEM REQUIREMENTS:
1. Microsoft Windows Script Version 5.6
http://msdn.microsoft.com/library/default.asp?url=/downloads/list/webdev.asp

INSTRUCTIONS

1. Copy the script to the drive you want to fill up.
2. Run the script by double-clicking on it.

NOTES

* This script should not be used on the system drive (usually C:).
* The blank files will be created in "X:\EraseFreeSpaceBlankFiles".
* After the script completes, you may optionally delete the blank files.
* If you stop and restart the script without deleting the blank files, 
   it will continue where it left off.
* The script will show space left, estimated time left, and write speed.
   You can use this script as a crude disk write speed benchmark!
* This script will fill the drive with files containing zeros.  Since most
   disk drives have areas of reserved storage space, no guarantee is made 
   that all information on the disk will be overwritten.

</description>
</runtime>
<script language="VBScript">
<![CDATA[
Option Explicit

' Force execution from command shell (cscript) mode
ForceCScriptExecution

' Run the main program and quit
RunMainProgram

WScript.Quit

' ======================================================
' ================  Main Program Section  ==============
' ======================================================

Sub RunMainProgram()
	Dim objFSO, objDrive, objBlankFile
	Dim NumberCreated, TotalRunTime
	Dim S, E, BlankIndex, ErrorNumber
	Dim AverageSpeedMBPerSecond, TimeLeftSeconds
	Dim str10MBString, BlanksPath, BlankFilePath, DiskFreeSpace
	Const BytesInMegabyte = 1048576
	Const BytesInGigabyte = 1073741824
	Dim BlankFileLength : BlankFileLength = BytesInMegabyte * 10

	Set objFSO = CreateObject("Scripting.FileSystemObject")

	' Get the number of gigabytes of the current drive
	Set objDrive = objFSO.GetDrive(objFSO.GetDriveName(WScript.ScriptFullName))

	' Create the blank folder
	BlanksPath = objFSO.BuildPath(_
		objFSO.GetDriveName(WScript.ScriptFullName), _
		"\EraseFreeSpaceBlankFiles")
	If Not objFSO.FolderExists(BlanksPath) Then
		objFSO.CreateFolder BlanksPath
	End If
	WScript.Echo "Filling " & _
		FormatNumber(Round(objDrive.FreeSpace/BytesInGigabyte, 3),3) & _
		" GB of free space in drive " & _
		objFSO.GetDriveName(WScript.ScriptFullName)

	' Loop until the the write fails
	NumberCreated = 0
	BlankIndex = 0
	TotalRunTime = 0
	str10MBString = String(BlankFileLength,"0")
	Do While True
		BlankIndex = BlankIndex + 1
		BlankFilePath = objFSO.BuildPath(BlanksPath, "\blank_" & _
			BlankIndex & ".zero")
		If Not objFSO.FileExists(BlankFilePath) Then
			DiskFreeSpace = objDrive.FreeSpace
			' Create the blank file
			S = Timer
			' Try to create the file
			On Error Resume Next
			Set objBlankFile = _
				objFSO.CreateTextFile(BlankFilePath, False, False)
			ErrorNumber = Err.Number
			On Error Goto 0
			If ErrorNumber = -2147024784 Then
				Exit Do
			ElseIf ErrorNumber <> 0 Then
				Err.Raise ErrorNumber, "EraseFreeSpace", ErrorNumber
			End If

			' Reset the file to fill up the space
			If DiskFreeSpace < BlankFileLength Then
				str10MBString = String(DiskFreeSpace,"0")
			End If
			
			' Try to write to the file
			On Error Resume Next
			objBlankFile.Write str10MBString
			ErrorNumber = Err.Number
			On Error Goto 0
			If ErrorNumber = -2147024784 Then
				Exit Do
			ElseIf ErrorNumber <> 0 Then
				Err.Raise ErrorNumber, "EraseFreeSpace"
			End If
			objBlankFile.Close
			Set objBlankFile = Nothing
			E = Timer
			If DiskFreeSpace > BlankFileLength Then
				NumberCreated = NumberCreated + 1
			End If
			TotalRunTime = TotalRunTime + (E - S)
			If TotalRunTime <> 0 Then
				AverageSpeedMBPerSecond = NumberCreated * 10 / TotalRunTime
				TimeLeftSeconds = ((DiskFreeSpace / BytesInMegabyte) / _
					AverageSpeedMBPerSecond)
				WScript.Echo _
					FormatNumber(Round(DiskFreeSpace/BytesInGigabyte, 3),3) & _
					" GB remaining. Wrote " & _
					FormatNumber(Round(NumberCreated * 10 / 1000,2),2) & _
					" GB at " & _
					FormatNumber(Round(AverageSpeedMBPerSecond, 2),2) & _
					" MB/s. Minutes left " & _
					LeftPad(Int(TimeLeftSeconds/60), "0", 3) & ":" & _
					LeftPad(TimeLeftSeconds Mod 60, "0", 2)
			End If
		End If
	Loop
	WScript.Echo "Completed filling drive. Press CTRL-C to Exit"
	WScript.Sleep 60*1000*60

End Sub

' Force execution in cscript.exe rather than wscript.exe
Function ForceCScriptExecution()
	Dim objShell

	' If running in cscript, do nothing
	If LCase(Right(WScript.FullName,11)) = "cscript.exe" Then
		Exit Function
	End If

	' If running in wscript, execute the script using cscript
	' and then quit this script
	If LCase(Right(WScript.FullName,11)) = "wscript.exe" Then
		Set objShell = CreateObject("WScript.Shell")
		objShell.Run "cscript.exe """ & WScript.ScriptFullName & """", 1, False
		Set objShell = Nothing
		WScript.Quit
	End If
	
	' If script engine anything else, quit with an error
	WScript.Echo "Invalid scripting engine."
	WScript.Quit
End Function

' Pad the string with the character specified
' on the left so that the resulting length of
' the string is at least LengthToPad
' Return the padded value as a string 
' Null values are treated as empty strings
Function LeftPad(ByVal ValueToPad, ByVal Character, ByVal LengthToPad)
	Dim ConvertedValue, CountCharacters
	If Len(CStr(Character)) <> 1 Then
		Serr "LeftPad: Character not length one."
	End If
	If Not IsNumeric(LengthToPad) Then
		Serr "LeftPad: Length not numeric."
	End If
	If IsNull(ValueToPad) Then
		ValueToPad = ""
	Else
		ConvertedValue = CStr(ValueToPad)
	End If
	CountCharacters = LengthToPad - Len(ConvertedValue)
	If CountCharacters > 0 Then
		LeftPad = CStr(String(CountCharacters, Character) & ConvertedValue)
	Else
		LeftPad = CStr(ConvertedValue)
	End If
End Function


]]>
</script>
</job>