Skip to main content

Thinking the TakeCommand way.

As you know, I'm a fan of using TakeCommand on Windows. It's a great interactive shell but it also provides some pretty powerful scripting tools too.  Personally, I wouldn't write long scripts in it but it's adequate for many tasks and certainly better than CMD.EXE.  That's just torture.


Functions, not piping, for the win.

Long form:

Using TakeCommand is not like using Unix shells, like Bash or KornShell.  The Windows operating system is more function-oriented than byte stream-oriented.  Piping is possible but not natural.

As a result, it took me a long time to figure out a simple problem.

Find the total amount of space that my index.js files occupy, in a tree of directories?

I tried piping.  On Unix, it's a one liner:

find . -name index.js -printf "%s %p\n" |awk 'BEGIN{sum=0}{ sum+=$1 }END{print sum}'

But that actually doesn't work correctly under the new Bash on Windows.  File sizes appear to be messed up.

I tried the FOR loop in TakeCommand.  This monstrosity is a direct descendant from DOS, which makes sense because TakeCommand is an extended DOS/Windows shell, not a replacement or alternative.  I could read lines from the "@CON" file (yes, that's the name when using the FOR loop). And then I'd be summing lines one at a time using the Take Command language.  While I/O would dominate the time, this just seemed clunky.

The final solution was simple but not obvious to find. It has changed how I think about using TakeCommand.

TakeCommand lets to you sophisticate file matching, more than just file globbing as in Unix.  It's more like VAX/VMS (blast from the past!)  To match all the index.js files recursively, type:

index.js /S

In addition, TakeCommand has tons of built-in functions.  There's one called @FILESIZE.  Combine the two ideas and you get a filesize function that can recurse through a list of files (!)

Thus, the solution to my problem is this:

echo %@COMMA[%@FILESIZE[index.js/S]]

Which gives the result, comma separated I might add.  And it's quite fast.

You can use the /S form in any of the built-in TakeCommand commands, like COPY or MOVE. You can select files by size, date-range, even attributes (like HIDDEN or ARCHIVE).


Popular posts from this blog

Using Fossil SCM with Jenkins CI

Currently, there is no SCM plugin for Fossil in Jenkins. I've been coding one but it's not yet ready.

Update: I have permission from my employer to open source the plugin. Now if only I had the time...

Update 2:  I've created a github repo for my code:

It turns out, you should be able do a pretty good job of integrating Fossil into Jenkins without using such a plugin.

Here's my idea:

For now, you should just need the Xtrigger plugin. This plugin is capable of triggering a build based on a number of things changing. Among them, a web-addressable piece of content in XML.

Fossil is able to generate RSS feeds trivially.

On the Fossil machine, you'll want to start the fossil server as usual:

$ fossil server --port=1234

On the Jenkins machine, you'll simply install the Xtrigger plugin and set it to trigger a build, by polling the following URL for changes:



Why Fossil-SCM is an excellent choice for introductory programming courses

Fossil SCM for introductory programming courses The use of source control management (or version control - take your pick) is an important skill for new programmers to adopt.  It is expected that all programmers use SCM in their daily jobs, in order to coordinate changes among team members.  Thus, getting beginners to adopt good habits early should be a goal.

While GIT (  is certainly the dominant source control system of today, I believe instructors of introductory classes in programming should consider an alternative called Fossil (

Fossil has several compelling advantages in education over GIT.  You will see that I value the practical aspects of Fossil even more than its technical capabilities.  After all, an instructor has a limited amount of time to have an impact and they don't want to waste time doing technical support on a tool that is too complex.  Helping one or two people is fine but helping 30 can be a real burden.

Simple installation and …

So you want to use Fossil DVCS as your SCM solution? Here are some first steps.

First steps when using Fossil SCM.

Download the executable from

Depending on your programming language and operating systems, you'll want to make sure you ignore certain kinds of file extensions.

You might want to create a configuration file and store it in fossil for use in other fossil setups.  The configuration file goes into the top level directory under a folder called ".fossil-settings".  The filename matches the configuration setting, thus it is called "ignore-glob".

For unix/linux, I would ignore the following file extensions (you can put one per line or separate them with commas. I'll use the per line convention here.)


For Windows, I would ignore these:


Next, you'll want to decide on binary file for the purpose of merging. These go in the .fossil-settings/binary-glob file:


Typing fossil settings binary-…