Running the Less.js command-line compiler on Windows


For example LESS supports variables:

@brand_color: #4D926F;
#header {
   color: @brand_color;
h2 {
   color: @brand_color;

nested rules:

#header {
  color: red;
  a {
    font-weight: bold;






Running on Windows





To use it, invoke lessc.wsf via cscript.exe like so:



lessc input.less [output.css] [-compress] 



C:codelessc-wsh>lessc test.less
/* Variables */
#header {
  color: #4d926f;
h2 {
  color: #4d926f;
/* Mixins */
#header {
  -moz-border-radius: 5px;
  -webkit-border-radius: 5px;
  border-radius: 5px;





Follow @duncansmart on Twitter

50 thoughts on “Running the Less.js command-line compiler on Windows

  1. Absolutly excellent!

    I have been trialling both compass(with sass and haml) and less for the last 2 days. Less seemed considerably easier to use, all bar the issue of serving up css files via javascript. That was the single biggest headache. Yes, for Mac users there is a compiler, but no simple solution for windows users – this file seems to be the answer.

    Now.. if someone could create an adobe air app.. that would be the ultimate LOL

    Thanks again for taking the time to write this.

  2. Just what I needed 🙂

    I’ve now got a nice setup running with something called “File Watcher Simple” I found on sourceforge and your package. Makes my work so much simpler!

    Thank you.

  3. Hey man. I greatly appreciate the work you put into this. Most likely I’m going to end up just using Node.js, but I have to say, you should definitely gear this towards designers who might be less comfortable with complex installations (though what designers are using windows? 😉 )

    I downloaded your files and they work great. Seriously outstanding effort.

  4. Hi Duncan,

    Thanks so much for putting this together. As one of those designers who’s spent the last few hours trying complex installations on Windows, this was a breeze 🙂

    I have run into 2 hickups though.
    Pathing: Whenever I have a path to a webfont or a background image, I’m getting some extra ././’s
    expected result: src: url(‘webfonts/woff/myfont.woff’) format(‘woff’)
    compiled result: src: url(‘.\.\webfonts/woff/myfont.woff’) format(‘woff’)

    Hover states: for some reason, I’m getting an extra space on my :hover elements.
    expected result: a:hover {blah blah}
    compiled result: a :hover {blah blah}

    It’s not too bad to do a few find and replaces before upload, but if you have any insights on how to fix this it’d be awesome.

    Thanks again!

    1. If you’re using :hover, you need to have an ampersand before it. The ampersand concatenates with the parent. So a{ &:hover{} } will output a:hover , but without the ampersand you just get a space.

    2. Ryan, regarding your webfont path issue: I’ll take a look at that. Could you post a bot more of your style declaration so I can try to repro?

      1. I was having a similar issue with backslashes, so I stuck in
        css = css.replace(/\\/g, '/');
        before outputting the code.

  5. This is great! Haven’t tested it yet but I will when I get a chance…I have been trying to Less.js to work with my browser add-on but it fails on Firefox (due to security issues I think). But compiling in advance solves the problem. Bing bang boom!

  6. Hey Duncan,
    Great work!

    I have used your script and build 2 awesome LESS tools upon it:

    You can find them here:

    WinLess is a compiler (with GUI) for LESS. WinLess can watch your LESS files, and automatically compile them when they have changed. WinLess is similar to, which is a LESS application for OSx.

    With the LessBuildEventScript you can easily integrate LESS within your Visual Studio projects. Your LESS files will then be compiled on each build.

    I would strongly advise agains using dotlesscss based solutions or any other solutions which don’t use less.js for the actual compiling. less.js is written by the author of the LESS language. In my expercience other solutions are often buggy and behind on newer features.

    1. Looks good! I agree about the dotless stuff. Indeed one of the motivations of less.wsf was because dotless was lagging behind in the features.

  7. Excelent work, I use your script in my projects.

    I have one question, but I’m not sure if it’s for you or creator of fork of Less in Javascript.

    This is:

    tr .exampleLevel1 {
        margin: 2px;
        td .exampleLevel2{
            margin: 3px;

    It send me a compiler error using “&>span” but not for “>span”, is it syntactically incorrect on LESS ?.

    1. @JAGH, glad to hear it!

      Yes, > span is what you want, you don’t need the extra “&”. You typically use & for things like pseudo selectors such as &:hover

      1. Appears to be a bug in the version of the JScript engine being used in WScript. If you use the online less compiler with IE in Compatibility View you get the same result as my script. Maybe some difference in the Regex engine?

  8. Hey Duncan,
    Users of WinLess have reported a few compiling issues. As you know WinLess uses your cool script to be able to use less.js to compile the LESS files. I have no clue what could cause these issues or even where they should be fixed (in less.wsf or less.js).
    Maybe you could take a look at them and shed some light on the matter?

    Note: I have tested all of these issues in the browser ( ) and can confirm that they don’t appear there.

    Issue 1:
    When importing a less file the less.js changes the relative paths in that file so they will still work:
    background-image: url(‘../images/bg.gif’);

    Should become:
    background-image: url(‘subdirectory/../images/bg.gif’);

    But it becomes:
    background-image: url(‘subdirectory/subdirectory/../images/bg.gif’);

    Issue 2:
    “When an imported file is empty, the next imported is not processed

    I use several imports to generate a single CSS file, and if a file output is empty (either it’s been fully commented to test something, or just deleted its content), the next imported file is ignored in the output and no error is given.”

    Issue 3:
    Using the ‘&’ operator after a selector doesn’t work properly. In the output the ‘&’ parts get places before the subselector instead of after it:

    #main {
    #content {
    .class {
    #container }

    Should output:
    #main #content .class { position: absolute; }
    #container #main #content .class { position:relative; }

    But this is what it does output:
    #main #content .class #container { position: relative; }

    Note: this usage of the ‘&’-operator isn’t documented. In the documentation it only shows the operator being used before a selector. However, it does work when trying this example in the browswer.

  9. I’m sorry for the bother, again, but I have another issue (this is file2.less):

    /* IE6 IFRAME FIX (taken from datepicker 1.5.3 */
    .ui-datepicker-cover {
    display: none; /*sorry for IE5*/
    display/**/: block; /*sorry for IE5*/
    position: absolute; /*must have*/
    z-index: -1; /*must have*/
    filter: mask(); /*must have*/
    top: -4px; /*must have*/
    left: -4px; /*must have*/
    width: 200px; /*must have*/
    height: 200px; /*must have*/

    The part of “display/**/: block; /*sorry for IE5*/” causes a error on compilation when compiled alone, I think it’s correct, but when I have ( this is allCss.less):

    @import “file1”;
    @import “file2”;

    It fails silently, don’t generates allCss.css, assuming that file1.css has correct sintax.

    1. @Jagh Try this, using the ~"..." escaping technique:

      .ui-datepicker-cover {
         // hide from IE5 using hack
         display: ~"none; display/**/: block";
         // other browsers
         position: absolute;
         z-index: -1;
         filter: mask();
         top: -4px;
         left: -4px;
         width: 200px;
         height: 200px;
      1. Thanks for the technique, but my question is: is it normal that compiler fails silently when exists error in one imported file instead send me one error ?

  10. I am looking to add support for LESS inside my Build script, I am using PHP’s Phing which is just like the ANT build script. So this looks like the best solution, my build script can run commands line stuff, thanks

  11. help! trying to use this with twitter.bootstrap. both your command line version . .and some GUI wrapper (winless) throw the below error. less bootstrap files are available on root less file is bootstrap.less, it imports others.
    Any help appreciated. The other methods .. using node.js (for windows) tried that . . no go. tried cygwin .. no go. could try to run a linux vm I guess. but this would be a lot more convenient 🙂


    C:\Development\precise\PreciseASP\PreciseASP\Content\less>lessc bootstrap.less bootstrap.css
    type: Syntax
    message: ‘eval’ is null or not an object
    filename: bootstrap.less
    column: -1
    extract: ,, * Bootstrap v2.0.3
    Press any key to continue . . .

      1. did this fix (which is actually for winless) and it also fixed it for Duncans’s stuff.

        Atm, I have no idea why, but when you change it to something like this it works:
        The problem with the latest version of bootstrap is caused by the following mixin in mixin.less:

        // IE7 inline-block
        // —————-
        .ie7-inline-block() {
        *display: inline; /* IE7 inline-block hack */
        *zoom: 1;
        dummy: huh;

        add the dummy line, and it works.

  12. Probably missing something simple here. I want to use the lessc alias but can’t get it to work. I tried adding the directory I downloaded the code into to my PATH environment variable, but this didn’t make any difference.

    If I try running this:

    lessc.cmd test.less output2.css

    I get this:

    /less.js-windows/lessc.cmd: line 1: ::For: command not found
    /less.js-windows/lessc.cmd: line 2: @cscript: command not found

    If I try just running ‘lessc’ (without the .cmd extension) I just get “lessc: command not found”.

    What am I missing here?!

    1. Matthew, are you running this from a regular Command Prompt window? I have a feeling you may be running it in a bash console…

      1. Aha! You’re right — I tend to use Git’s Windows Bash shell for familiarity. When I tried it in cmd.exe it worked! Thank you, can’t believe I didn’t try that.

        This is a great tool, thanks so much for the work.

  13. Hi Duncan,
    I’m using the lessc.wsf to compile my main.less file, but the result is strange and i’m not figuring out what is the problem.

    The problem is that the content of my main file is repeating 5 times, when compiles it does the imports of the files ok.
    For example:

    @import “less/bootstrap.less”; //add the compiled content OK

    all my styles here // repeates 5 times

    I done some tests like. My file have 435 lines and repeats 5 times my styles, with 434 lines it works ok.
    There is some characters/size/lines limitation for the compiler?

    There some way can i send you my test?

  14. Great tool, thanks a lot. But I just found a tiny glitch:
    The script fails for files with >= 35 @import directives:

    type: Syntax
    message: ‘eval’ is null or not an object
    filename: C:\web\styles.less
    column: -1
    extract: ,,@import “page-basic.less”;

  15. Less watcher batch script (copy-paste to less-watch.cmd)

    :: Less watcher
    :: Author: Alex Skrypnyk (
    :: Modified: 24/09/2012
    :: Version 1.0
    :: lessc must be installed
    :: [Original blog post](
    echo Starting watching %1. Output will be writtem to %2.
    echo Use Ctrl-C to stop watching.
    for /L %%n in (1,0,10) do (
    call “%~dp0lessc.cmd” %*
    timeout /T 1 /NOBREAK>nul

    Hope this will help someone.

Leave a Reply to Sean Cancel reply


You are commenting using your account. Log Out /  Change )

Google photo


Twitter picture


Facebook photo


Connecting to %s