Archive for the ‘Batch’ Category


Creating a Daily Journal in Evernote


This post has now been migrated to

Follow this link to go directly to the article


An Improved Template System for Evernote


This post has now been migrated to

Follow this link to go directly to the article.


Top FlagIT Posts of 2009


It’s been about a year since I started blogging here and whilst it was primarily supposed to be a site for quick useful tech-related posts several have grown into far larger posts.  Whilst some posts have remained somewhat quiet on the number of reads others have generated far more interest than I could have expected.

It’s actually five more days until this blog is a year old, but I thought that new year’s day might be as good an opportunity to review what the top ten posts were.  This has been based on the number of visits from more than six and a quarter thousand since the blog was created.

10. Reclaim more Memory on a Windows Mobile Device

Posted: 04/04/2009

Reads: 95 (Daily Average 0.35)

Windows mobile phones have a finite amount of memory and like any operating system (particularly M$ ones?) memory leaks can stop memory being released.  This post highlights how to resolve some storage issues with the Mobile Opera browser and a useful tool for reclaiming that memory lost to leakage.

9. Simple Template Workaround for Evernote

Posted: 21/11/2009

Reads: 95 (Daily Average 2.32)

A relatively recent post about one of my favourite pieces of software (Evernote) and how to use a simple bit of scripting to create templates in Evernote.

8. A Ceiling Function for VBScript

Posted: 31/07/2009

Reads: 133 (Daily Average 0.86)

This post includes some VBS code to round a number off to the greatest integer.

7. Developer Tabs and Drop Down Lists in Word 2007

Posted: 17/03/2009

Reads: 135 (Daily Average 0.47)

This post explains how to access the developer tab in Microsoft Word 2007 and briefly discusses some of the shortcomings of the drop down lists it offers.

6. VBScript – Count Occurrences in a Text String

Posted: 30/07/2009

Reads: 148 (Daily Average 0.95)

Another simple bit of VBS code that counts the number of instances of a string of text within another string of text.

5. Omnia to Oblivia (and back)

Posted: 05/04/2009

Reads: 151 (Daily Average 0.56)

I have a Samsung Omnia mobile phone and have had a number of issues with it.  This describes how I resolved one of the most difficult issues with the file system constantly mounting and dismounting a storage device.

4. A Flexible Progress Window in VBScript

Posted: 19/07/2009

Reads: 169 (Daily Average 1.02)

Another popular bit of VBS code is some that builds a customisable progress window based around dynamically updating a web page that is automatically loaded into a browser.  The progress window allows the user to display messages and progress bars.

3. VBScript – Select a Folder

Posted: 28/03/2009

Reads: 278 (Daily Average 1.00)

The most popular VBS code post on the blog in the past year this one shows how to access a common dialog to select a folder and pass this back to the main code.

2. Controlling Spotify

Posted: 29/07/2009

Reads: 1172 (Daily Average 7.51)

At this point we see a big change in the number of reads of the posts.  This particular post’s popularity is most likely related to the popularity of Spotify.  The post describes a way in which an iPhone emulator can be used on a PC running Microsofrt Windows PC to control Spotify installed on an Apple Mac.

1. Excel – Dynamic Drop Down Lists with Full Validation

Posted: 15/03/2009

Reads: 1272 (Daily Average 4.36)

At the top spot is a post relating to Microsoft Excel.  It looks at how to overcome some of the limitations on dynamically populated drop down lists.  There are a number of other Excel related posts on the blog that people may find useful in combination with this and it has certainly made quite an impact with some of the spreadsheets I’ve developed for colleagues at work.  It seems as though that popularity is spreading to hundreds of others across the Internet.

So please have a look through these top ten (and others if you like) and I’d encourage you to leave a comment or rate the post.  If you like the content why not subscribe to one of the RSS feeds?


DOS Command Class for VBScript


This post has now been migrated to

Follow this link to go directly to the article.


Command Line Utility to Create Test Files

Using the utility on the command line

Using the utility on the command line

In the past I’ve used FSUTIL to create large test files of data to process.  Unfortunately you need administrator permissions to use this utility.  I decided to write a command line utility (called “Make Test File” but abbreviated to MTF.EXE) to allow non-administrators to do the same.  It’s written in VB.NET so it isn’t as quick as FSUTIL, but as they say “it does the job”, and it fulfilled my immediate needs.

It takes two parameters – the size of the file (in bytes) and the file path to write the file to.  To see an example of how to use it and the output click on the thumbnail image on the right.  The resulting file just contains zeros.

If there’s any demand I may look into additional features such as being able to specify what the file is filled with or creation of multiple files using some sort of incremental naming convention.


Don’t log on as admin just yet


On Windows XP you may find that you need to carry out some tasks as an administrator for which you would logon as  an administrator (local or network/domain).  If the user is already logged on then you can choose to run as administrator for many activities by selecting run as from a file’s context menu.  However not every type of file has this option.

My preferred method to get around this is to run a file management application as an administrator and then any file action from within that is run as an administrator.  The RUNAS executable is accessible from the command line and along with the right selection of parameters should make this quite easy to do.  Unfortunately a restriction around instances (and the fact that the Windows Desktop is an instance of EXPLORER.EXE) means that EXPLORER.EXE can’t be run as – at least not without changing some settings in Windows.

The alternative is to use the fact that Internet Explorer is a standard component and has a synonymity with explorer.  So to quickly access the C drive in explorer (via Internet Explorer) I suggest popping the following line into a shortcut and deploying it to every machine or at least a quickly accessible folder on your network (with a short name you can then quickly type into a Run dialog).

runas /user:administrator "C:\Program Files\Internet Explorer\iexplore.exe c:"

This assumes your admin account is called “administrator” (add an ‘@yourdomain’ after this for domain admin access on the appropriate domain) and Internet Explorer is installed under program files in a folder called Internet Explorer.  You could similarly make this a .BAT file rather than a shortcut file (.LNK),  but I think the shortcut is a slightly neater looking option.

When run a command prompt window will be opened and ask for the password.  Type this in and press enter/return to have Windows open your nice admin file management session.  Just remember to close the window when you’ve finished … you don’t want to leave end users with admin access.


Continuous Ping


Sometimes when testing network connectivity to a server on the local LAN or a web site I use the ubiquitous PING to do the job.  If I need to do it repeatedly I tend to write a quick DOS batch file (a text based script with a file extension of BAT or CMD).

For example this script would repeatedly ping localhost – the name used for the machine the script is being run on.

@echo off
Ping -n 1 localhost

A few years ago I even extended this to include a ping count but it didn’t really add much. I decided it would be more useful to have something that at least gave an indication of how many “good and bad” pings had occurred. At the same time I also found that I wasn’t always necessarily at my computer as I might be tinkering with cables and other networking gear so having some sort of audible cue as to how the pings were going.

I put together the following VB Script to do just this. It hasn’t been tested extensively and I’m sure that there could be a bit more validation. When the script is run it asks for the host to ping and a time at which to stop pinging. It then opens up an Internet Explorer window that displays the information about the pinging.

Option Explicit

'- Number of PC speaker beeps on ping successes/failures
'- Milliseconds of pause between pings
Const PAUSE_MS = 200
'- Milliseconds pause before automatically closing the progress window
Const AUTO_CLOSE = True
Const FINAL_PAUSE = 5000

'Variable definitions
Dim strHost
Dim dtEnd
Dim objShell, objExplorer
Dim intSuccessfulPingCount, intUnsuccessfulPingCount

Set objExplorer = CreateObject("InternetExplorer.Application")

objExplorer.Navigate "about:blank"
objExplorer.ToolBar = 0
objExplorer.StatusBar = 0
objExplorer.Left = 0
objExplorer.Top = 0
objExplorer.Width = 400
objExplorer.Height = 400
objExplorer.Document.Body.Style.Cursor = "default"
intSuccessfulPingCount = 0
intUnsuccessfulPingCount = 0

'If we don't have a host then ask for one
If Wscript.Arguments.Count < 1 Then
	strHost = InputBox("Please enter the host to ping", "Enter Host", "localhost")
	strHost = Wscript.Arguments(0)
End If

'Double check what we have
If Len(strHost)  0
	'Carry out the ping
	If Ping(strHost, False) = True Then
		'Ping successful
		intSuccessfulPingCount = intSuccessfulPingCount + 1
		'Ping unsuccessful
		intUnsuccessfulPingCount = intUnsuccessfulPingCount + 1
	End If
	UpdatePings "<p><b>RUNNING...</b></p>"

objExplorer.Document.Body.Style.Cursor = "default"
	UpdatePings("<p><b>AUTO CLOSING...</b></p>")
	Wscript.Sleep FINAL_PAUSE
	UpdatePings("<p><b>PING CYCLE COMPLETED</b></p>")
End If

'Update the display of pings
Sub UpdatePings(p_strSuffix)
	Dim strDisplay

	strDisplay = ""

	strDisplay = strDisplay & "<p>"
	strDisplay = strDisplay & "Finish pinging @ "
	strDisplay = strDisplay & dtEnd
	strDisplay = strDisplay & "<br />"
	strDisplay = strDisplay & "Currently ... "
	strDisplay = strDisplay & Now()
	strDisplay = strDisplay & "</p>"

	strDisplay = strDisplay & "<hr>"

	strDisplay = strDisplay & "<p>"
	strDisplay = strDisplay & "<table border='0'>"
	strDisplay = strDisplay & "<tr>"
	strDisplay = strDisplay & "<td><font color='green'>Successful pings</font></td>"
	strDisplay = strDisplay & "<td><font color='green'>"
	strDisplay = strDisplay & intSuccessfulPingCount
	strDisplay = strDisplay & "</font></td>"
	strDisplay = strDisplay & "</tr>"
	strDisplay = strDisplay & "<tr>"
	strDisplay = strDisplay & "<td><font color='red'>Unsuccessful pings</font></td>"
	strDisplay = strDisplay & "<td><font color='red'>"
	strDisplay = strDisplay & intUnsuccessfulPingCount
	strDisplay = strDisplay & "</font></td>"
	strDisplay = strDisplay & "</tr>"
	strDisplay = strDisplay & "</table>"
	strDisplay = strDisplay & "</p>"

	strDisplay = strDisplay & "<hr>"

	strDisplay = strDisplay & "<p>"
	strDisplay = strDisplay & "Auto Close Enabled: "
	strDisplay = strDisplay & AUTO_CLOSE
	strDisplay = strDisplay & "</p>"

	strDisplay = strDisplay & "<hr>"

	strDisplay = strDisplay & p_strSuffix

	objExplorer.Document.Body.InnerHTML = strDisplay
End Sub

'This function pings the specified host
Function Ping(p_strHost, p_boolDisplay)
	Dim objPing, objStatus

	Set objPing = GetObject("winmgmts:{impersonationLevel=impersonate}").ExecQuery ("select * from Win32_PingStatus where address = '" & p_strHost & "'")

	For Each objStatus in objPing
		If IsNull(objStatus.StatusCode) or objStatus.StatusCode0 then
			Ping = False
			If p_boolDisplay Then
				WScript.Echo "Status code is " & objStatus.StatusCode
			End If
			Ping = True
			If p_boolDisplay Then
				Wscript.Echo "Bytes = " & vbTab & objStatus.BufferSize
				Wscript.Echo "Time (ms) = " & vbTab & objStatus.ResponseTime
				Wscript.Echo "TTL (s) = " & vbTab & objStatus.ResponseTimeToLive
			End If
		End if
End Function 

'Beep the PC speaker a number of times equal to the p_intBeeps parameter
Function Beep(p_intBeeps)

	Dim objShell, intCount, strCommand

	'Check we have a valid number of beeps not fool proof but it will do for now
	Beep = False
	If IsNumeric(p_intBeeps) Then
		If p_intBeeps > 0 Then
			Beep = True
		End If
	End If

	If Beep Then
		'Build the command string to run
		strCommand = "cmd /c echo"
		For intCount = 1 to p_intBeeps
			strCommand = strCommand & " " & chr(007)

		'Run the command in the background
		Set objShell = Wscript.CreateObject("wscript.Shell")
		objShell.Run strCommand, 0

		Beep = True
	End If
End Function

There are also a few options in the script to specify numbers of beeps for successful and unsuccessful pings as well as auto closing of the Internet Explorer window and lengths of pauses between pings and before auto closing the window.