Blog

Brad Wood

December 14, 2017

Spread the word


Share your thoughts

It's that time of year again.  Trees are lit, presents are being wrapped, and relatives are coming to visit.  That's right, it's time again for the 12 days of (CommandBox) Christmas-- 2017 edition!  We'll publish one invaluable hint from today until Christmas right here on the Ortus blog.  Consider it our early Christmas gift to you.

Stay on task

Right, so let's get going.  Today's tip are about CommandBox task runners.  These are now the easiest and most robust way to do CLI scripting in CFML.  What's that you say-- you thought CFML was only for web pages?? Not so!  With the advent of CommandBox, CFML is now capable of being run from the command line anywhere, without even needing a server to be installed!  

Those crusty batch files?  That shell script that takes a PhD to understand?  Those... shudder... Node scripts!  All of those are candidates for you to write in CFML.  Face it, you're faster and more familiar with doing things in CFML and you already have all the tools like database access, file manipulations, and familiar data structures.  Rewrite your cron jobs, spruce up your Ant builds, and automate your lazy coworkers with the power of CFML!

What is a Task Runner?

Don't worry one bit.  Firstly, task runners are fully documented right here:

https://ortus.gitbooks.io/commandbox-documentation/content/task-runners.html

Secondly tasks are very very simple.  In fact, we'll create one right now.  All you need is:

  1. A CFC file called "task.cfc"
  2. A method in the CFC called run()
  3. Just put the code you want to run inside the method!

Here's a super simple task runner that works.

component {
  function run() {
    print.greenLine( 'This is my first task!' );
  }
}

And now let's run it.  You don't need any servers running.  Just CD into the same folder as the task.cfc and run this:

CommandBox> task run
This is my first task!

What else can I do?

A lot. In fact, you can do anything that's possible in CFML.  Your tasks run on the Lucee engine that powers your CommandBox CLI so keep in mind that you can even take advantage of some Lucee features like optional semicolons in script and Lucee-specific functions.  Let's take a look at some quick and easy things to add to your task.

Pass parameters

Consider this simple task;

component{
    function run( string name ){
        print.line( 'Well, hello there #name#!' );
    }
}

Pass in named parameters with a dolon before the parameter name that you want to pass through to the task. 

task run :name=Brad 

Console output

Tasks don't return HTML.  Instead, they can print colored text to the console with a handy print helper.

print.line( 'I like Spam.' );

print.somethingBlue( 'UHF ' );

print.blackOnWhiteText( 'Inverse!' );

print.boldRedOnBlueText( "Test dirt, don't wash." );

print.boldBlinkingUnderscoredBlueTextOnRedBackground( "That's just cruel" );

Interact with users

Just because this is the CLI doesn't mean you can't interact with the user!

// Prompt the user for a line of text
favoriteColor = ask( 'WHAT, is your favorite color??' );

response = ask( message='Enter installation Directory: ', defaultResponse='/etc/foo/bar` );

// Capture the next key
ASCIICode = waitForKey( 'Press any key, any key.' );
print.line().line( 'My magic tells me you pressed: #Chr( ASCIICode )#' );

// Get confirmation
if( confirm( 'Do you like Pizza? [y/n]' ) ) {
    print.greenLine( 'Good for you.' );
} else {
    print.boldRedLine( 'Heretic!!' );
}

Hit a Database

Lucee has a sweet trick up its sleeve that allows you to declare datasource connections on the fly.  Look how to connect to a connect to a local MySQL database.

ds = {
  class: 'org.gjt.mm.mysql.Driver',
  connectionString: 'jdbc:mysql://localhost:3306/bradwood?useUnicode=true&characterEncoding=UTF-8&useLegacyDatetimeCode=true',
  username: 'root',
  password: 'myPass'
};

var qry = queryExecute( sql='select * from cb_role', options={ datasource : ds } );

for( var row in qry ) {
  print.line( row.role );
}

 

Add Your Comment

Recent Entries

Must-See Into the Box 2025 Sessions for CommandBox Users!

Must-See Into the Box 2025 Sessions for CommandBox Users!

Power Up your CommandBox experience and practices at Into the Box 2025

Want to get hands-on with the new CommandBox features or learn how others are pushing it to the next level? These are the must-see sessions at ITB 2025 if you're a CommandBox user:

Maria Jose Herrera
Maria Jose Herrera
April 21, 2025
Must-See ITB 2025 Sessions for TestBox Users!

Must-See ITB 2025 Sessions for TestBox Users!

Are you a fan of TestBox or looking to level up your testing game in 2025? Whether you're just getting started with unit testing or you're already building advanced specs for ColdBox and BoxLang apps, Into the Box 2025 has an exciting lineup tailored just for you. Into the Box 2025 has an exciting lineup tailored just for you. With the recent launch of TestBox 6.3.0 we have amazing new tools, features and tips and tricks to get your testing experience to the next level, review our sessions and test like a pro efficiently and easy!

From hands-on testing strategies to BoxLang innovations, here are the sessions you won’t want to miss this May — and why they matter to you as a TestBox user.

Maria Jose Herrera
Maria Jose Herrera
April 17, 2025
The Into the Box 2025 Agenda is LIVE and Done!

The Into the Box 2025 Agenda is LIVE and Done!

The wait is over! The official Into the Box 2025 agenda is now live — and it's packed with high-impact sessions designed for modern CFML and BoxLang developers. Whether you’re building APIs, modernizing legacy apps, diving into serverless, or exploring AI integrations, this is the conference you’ve been waiting for.

Here’s a look at what you can expect — categorized by key topics to help you plan your learning journey, there’s something for everyone covering modern CFML tools and BoxLang:

Maria Jose Herrera
Maria Jose Herrera
April 15, 2025