I know this is an old question now, but I kept ending up back here because I needed a similar solution (only for me it was a 10 second interval), and none of these answers worked. I've finally found a way today that I figured I'd post in case anyone ever ends up in a similar bind.
I found I couldn't use the xml modification method listed as an answer because we're using CF 9.0.1, and the xml would revert almost immediately after I changed it.
I tried looking into cURL, and discovered that while I could use cURL to call the process, I could not get windows scheduler to run in an interval less than a minute, either. Then while searching for a way to get the windows scheduler to run in smaller intervals (since I figured I couldn't fool CF at this point), I stumbled on a suggestion made on experts-exchange (I can't remember the url off hand now).
Based on that, I set up a test using this idea: Add another layer of program that calls the program you want to schedule. Have this layer loop with a sleep, and schedule it for an interval longer than a minute. Ultimately I went for a CF scheduled task that calls my "caller" every 2 minutes, and that "caller" has a loop that sleeps every X seconds.
Below is the code I used for the tests, formatted to answer the questioner's 30 second interval. I made use of a side log-management cfc to output debugging in a way that I could save and revisit.
The test file scheduled to run every 2 min:
<cfsetting requestTimeOut = "120000">
<cfscript>
/* Get starting count to keep track of overall running time */
Start = GetTickCount();
/* Set an ID for this process so I know */
thisProcess = CreateUUID();
counter = 0;
/* Set up a log-file-handler object.
* I will use the log lines to keep track of this process
* and whether or not it steps on itself.
* */
LogWriter = CreateObject('component','log.LogMgr').init('C:\Logs\');
LogFile = 'Test\30SecondTestLog';
LogWriter.WriteToLog('Information',LogFile,'#thisProcess# __ Started');
</cfscript>
<cftry>
<cfloop condition="Counter LT 4">
<!--- Output here is if you want to run it manually --->
<br /><cfdump var="#counter#">
<!--- Here you could put a cfhttp or similar trigger.
In my test I just used an update to a test DB table.
The catch here is that you don't want it to take too
long to get to the next steps, so you want to avoid
a long-running process that has to return something.
--->
<cfquery datasource="Marge" name="update">
Update test..testCount
Set CountField = CountField + 1
</cfquery>
<cfscript>
counter += 1;
LogWriter.WriteToLog('Information',LogFile,'#thisProcess# __ #counter# - Written');
/* Important part! Here is where the 30-second delay
* happens. However, we don't want to dally if this is
* the last time running it.
* */
if(counter NEQ 4){ sleep(30000); }
</cfscript>
</cfloop>
<!--- Time to output finishing details --->
<br />Done. <br />
<cfset End = GetTickCount()>
<cfdump var="#End - Start#">
<cfset LogWriter.WriteToLog('Information',LogFile,'#thisProcess# __ Done - Time: #End - Start#')>
<cfcatch type="any">
<cfset LogWriter.WriteToLog('Error',LogFile,'#thisProcess# __ #counter# - #cfcatch.message#')>
</cfcatch>
</cftry>
The logging cfc used for debugging:
<cfscript>
variables.LogHome = '';
</cfscript>
<cffunction name="init" raturntype="LogMgr">
<cfargument name="LogHome" type="string">
<cfset variables.LogHome = arguments.LogHome>
<cfreturn this>
</cffunction>
<!--- I wanted to use WriteLog, but that function name is already used in core CF --->
<cffunction name="WriteToLog" returntype="void" hint="writes to a log file.">
<cfargument name="LogType" type="string" hint="Based off cflog, expects severity level: Information, Warning, Error, or Fatal">
<cfargument name="LogPath" type="string" hint="Path and file from log root">
<cfargument name="LogString" type="string" hint="String to output in log">
<cfscript>
theFile = variables.LogHome & '\' & arguments.LogPath & '.log';
theString = arguments.LogType & chr(9) & DateFormat(Now(),'mm/dd/yyyy')& ' ' & TimeFormat(Now(),'HH:mm:ss');
theString &= ' ' & arguments.LogString;
</cfscript>
<cfif FileExists(theFile)>
<cffile action="append"
file="#theFile#"
output="#theString#"
addnewline="yes">
<cfelse>
<cffile action="write"
file="#theFile#"
output="#theString#"
addnewline="yes">
</cfif>
</cffunction>
</cfcomponent>
The test gave this log output when scheduled for a ten minute window:
Information 02/26/2013 15:29:00 F1E76BAE-C29A-208A-7B14339FD6B9B8D5 __ Started
Information 02/26/2013 15:29:00 F1E76BAE-C29A-208A-7B14339FD6B9B8D5 __ 1 - Written
Information 02/26/2013 15:29:30 F1E76BAE-C29A-208A-7B14339FD6B9B8D5 __ 2 - Written
Information 02/26/2013 15:30:00 F1E76BAE-C29A-208A-7B14339FD6B9B8D5 __ 3 - Written
Information 02/26/2013 15:30:30 F1E76BAE-C29A-208A-7B14339FD6B9B8D5 __ 4 - Written
Information 02/26/2013 15:30:30 F1E76BAE-C29A-208A-7B14339FD6B9B8D5 __ Done - Time: 90123
Information 02/26/2013 15:31:00 F1F9B64D-C29A-208A-73CEACA04A02F544 __ Started
Information 02/26/2013 15:31:00 F1F9B64D-C29A-208A-73CEACA04A02F544 __ 1 - Written
Information 02/26/2013 15:31:30 F1F9B64D-C29A-208A-73CEACA04A02F544 __ 2 - Written
Information 02/26/2013 15:32:00 F1F9B64D-C29A-208A-73CEACA04A02F544 __ 3 - Written
Information 02/26/2013 15:32:30 F1F9B64D-C29A-208A-73CEACA04A02F544 __ 4 - Written
Information 02/26/2013 15:32:30 F1F9B64D-C29A-208A-73CEACA04A02F544 __ Done - Time: 90053
Information 02/26/2013 15:33:00 F20C0329-C29A-208A-79C8C0D4C1E1FDFF __ Started
Information 02/26/2013 15:33:00 F20C0329-C29A-208A-79C8C0D4C1E1FDFF __ 1 - Written
Information 02/26/2013 15:33:30 F20C0329-C29A-208A-79C8C0D4C1E1FDFF __ 2 - Written
Information 02/26/2013 15:34:00 F20C0329-C29A-208A-79C8C0D4C1E1FDFF __ 3 - Written
Information 02/26/2013 15:34:30 F20C0329-C29A-208A-79C8C0D4C1E1FDFF __ 4 - Written
Information 02/26/2013 15:34:30 F20C0329-C29A-208A-79C8C0D4C1E1FDFF __ Done - Time: 90054
Information 02/26/2013 15:35:00 F21E5001-C29A-208A-744291B2817D7702 __ Started
Information 02/26/2013 15:35:00 F21E5001-C29A-208A-744291B2817D7702 __ 1 - Written
Information 02/26/2013 15:35:30 F21E5001-C29A-208A-744291B2817D7702 __ 2 - Written
Information 02/26/2013 15:36:00 F21E5001-C29A-208A-744291B2817D7702 __ 3 - Written
Information 02/26/2013 15:36:30 F21E5001-C29A-208A-744291B2817D7702 __ 4 - Written
Information 02/26/2013 15:36:30 F21E5001-C29A-208A-744291B2817D7702 __ Done - Time: 90029
Information 02/26/2013 15:37:00 F2309E2F-C29A-208A-7D6A5A2D1CA7D9EF __ Started
Information 02/26/2013 15:37:00 F2309E2F-C29A-208A-7D6A5A2D1CA7D9EF __ 1 - Written
Information 02/26/2013 15:37:30 F2309E2F-C29A-208A-7D6A5A2D1CA7D9EF __ 2 - Written
Information 02/26/2013 15:38:00 F2309E2F-C29A-208A-7D6A5A2D1CA7D9EF __ 3 - Written
Information 02/26/2013 15:38:30 F2309E2F-C29A-208A-7D6A5A2D1CA7D9EF __ 4 - Written
Information 02/26/2013 15:38:30 F2309E2F-C29A-208A-7D6A5A2D1CA7D9EF __ Done - Time: 90013
Information 02/26/2013 15:39:00 F242ED34-C29A-208A-7952DA25AF0C446D __ Started
Information 02/26/2013 15:39:00 F242ED34-C29A-208A-7952DA25AF0C446D __ 1 - Written
Information 02/26/2013 15:39:30 F242ED34-C29A-208A-7952DA25AF0C446D __ 2 - Written
Information 02/26/2013 15:40:00 F242ED34-C29A-208A-7952DA25AF0C446D __ 3 - Written
Information 02/26/2013 15:40:30 F242ED34-C29A-208A-7952DA25AF0C446D __ 4 - Written
Information 02/26/2013 15:40:30 F242ED34-C29A-208A-7952DA25AF0C446D __ Done - Time: 90045
I hope this can help anyone else who couldn't get the other answers to work!
cfschedule
tag too, but at least CF9 wiped this task after first execution -- so I've considered the solution invalid. – Emlynne