I came up with the following implementation. I use it for web development projects. Consoles for task runners (ex: gulp), git, javascript compilers (ex: typescript), etc. The goal was to open 4 console windows and change directory to the directory where I executed the *.cmd. I did not want to have multiple copies of the batch script incase I had to change it. I did not want the shell to be batch and I wanted the shell to be bash. I'm on windows, so, cygwin is needed for bash shell.
I created an arbitrarily named .cmd file. I called mine 4 consoles.cmd
. Cygwin is installed (the 64bit version in my case). Also the Cygwin chere
package is installed and required.
4 consoles.cmd
content:
@echo off for %%i in ("%~dp0..\..") DO (set dirVar=%%~ni) for %%i in ("%~dp0.") DO (set dir2Var=%%~ni) set finalValue=%dirVar% %dir2Var% start C:\"Program Files"\ConEmu\ConEmu64.exe -cmdlist ^ C:\cygwin64\bin\bash -c "/bin/xhere /bin/bash.exe" -cur_console:fna:t:"%finalValue%":C:"C:\cygwin64\Cygwin.ico" ^|^|^| ^ C:\cygwin64\bin\bash -c "/bin/xhere /bin/bash.exe" -cur_console:s1TVna:t:"%finalValue%":C:"C:\cygwin64\Cygwin.ico" ^|^|^| ^ C:\cygwin64\bin\bash -c "/bin/xhere /bin/bash.exe" -cur_console:s1THna:t:"%finalValue%":C:"C:\cygwin64\Cygwin.ico" ^|^|^| ^ C:\cygwin64\bin\bash -c "/bin/xhere /bin/bash.exe" -cur_console:s2THna:t:"%finalValue%":C:"C:\cygwin64\Cygwin.ico"
I put 4 consoles.cmd
in a File hosting service for backup purposes incase my hard drive crashes. Also for some convenience when sharing between development machines.
The batch script will change directory for all 4 console windows to the directory where the .cmd exists. So I created Hard Symbolic links in the directory where I want all 4 console windows to change directory into. The symbolic links point back to the canonical 4 consoles.cmd
.
Run a symbolic link and the 4 console shells working directories will be the location which the symbolic link is on the file system
My gulp task runner code for anyone that is interested
package.json
{ "name": "MyApp", "version": "1.0.0", "description": "", "main": "gulpfile.js", "private": true, "devDependencies": { "del": "^1.2.0", "gulp": "^3.9.0", "gulp-batch": "^1.0.5", "gulp-concat": "^2.5.2", "gulp-imagemin": "^2.2.1", "gulp-minify-css": "^1.1.6", "gulp-ng-annotate": "^1.0.0", "gulp-plumber": "^1.0.1", "gulp-rename": "^1.2.2", "gulp-sourcemaps": "^1.5.2", "gulp-uglify": "^1.2.0", "gulp-watch": "^4.2.4", "imagemin-pngquant": "^4.1.0" }, "author": "Author", "license": "ISC" }
bower.json
{ "name": "MyProject", "version": "1", "license": "MIT", "private": true, "ignore": [ "**/.*", "node_modules", "bower_components" ], "dependencies": { "bootstrap": "~3.3.4", "jquery": "~2.1.3", "angular": "~1.4.0", "angular-route": "~1.4.0", "angular-animate": "~1.4.0", "font-awesome": "~4.3.0", "underscore": "~1.8.3", "bootstrap-datepicker": "~1.4.0", "angularjs-toaster": "~0.4.12", "angular-scroll": "~0.7.0", "moment": "~2.10.2", "angular-loading-bar": "~0.7.1" } }
gulpfile.js
'use strict'; var gulp = require('gulp'); var batch = require('gulp-batch'); var sourcemaps = require('gulp-sourcemaps'); var minifycss = require('gulp-minify-css'); var uglify = require('gulp-uglify'); var rename = require('gulp-rename'); var concat = require('gulp-concat'); var del = require('del'); var plumber = require('gulp-plumber'); var watch = require('gulp-watch'); var imagemin = require('gulp-imagemin'); var pngquant = require('imagemin-pngquant'); var ngAnnotate = require('gulp-ng-annotate'); gulp.task('default', ['clean'], function () { gulp.start('images', 'vendorCss', 'applicationCss', 'fontIcons', 'vendorJavascript', 'applicationJavascript'); }); gulp.task('clean', function (cb) { del(['./dist/*'], cb); }); gulp.task('images', function () { return gulp.src([ './content/img/**/*' ]) .pipe(imagemin({ optimizationLevel: 3, progressive: true, interlaced: true, svgoPlugins: [{ removeViewBox: false }], use: [pngquant()] })) .pipe(gulp.dest('./dist/img')); }); gulp.task('fontIcons', function () { return gulp.src([ './bower_components/bootstrap/dist/fonts/**.*', './bower_components/font-awesome/fonts/**.*' ]) .pipe(gulp.dest('./dist/fonts')); }); gulp.task('vendorCss', function () { return gulp.src([ './bower_components/bootstrap/dist/css/bootstrap.css', './bower_components/font-awesome/css/font-awesome.css', './bower_components/angularjs-toaster/toaster.css', './bower_components/bootstrap-datepicker/dist/css/bootstrap-datepicker3.css', './bower_components/angular-loading-bar/build/loading-bar.css' ]) .pipe(concat('vendor.css')) .pipe(gulp.dest('./dist/css')) .pipe(rename({ suffix: '.min' })) .pipe(minifycss()) .pipe(gulp.dest('./dist/css')); }); gulp.task('vendorJavascript', function () { return gulp.src([ './bower_components/jquery/dist/jquery.js', './bower_components/angular/angular.js', './bower_components/angular-route/angular-route.js', './bower_components/angular-resource/angular-resource.js', './bower_components/angular-animate/angular-animate.js', './bower_components/angular-scroll/angular-scroll.js', './bower_components/angular-loading-bar/build/loading-bar.js', './bower_components/angularjs-toaster/toaster.js', './bower_components/bootstrap/dist/js/bootstrap.js', './bower_components/bootstrap-datepicker/dist/js/bootstrap-datepicker.js', './bower_components/underscore/underscore.js', './bower_components/moment/moment.js' ]) .pipe(sourcemaps.init()) .pipe(concat('vendor.js')) .pipe(gulp.dest('./dist/script')) .pipe(uglify()) .pipe(rename('vendor.min.js')) .pipe(sourcemaps.write('.')) .pipe(gulp.dest('./dist/script')); }); gulp.task('applicationCss', function () { return gulp.src([ './content/css/site.css', './content/css/animation.css' ]) .pipe(plumber()) .pipe(concat('app.css')) .pipe(gulp.dest('./dist/css')) .pipe(rename({ suffix: '.min' })) .pipe(minifycss()) .pipe(gulp.dest('./dist/css')); }); gulp.task('applicationJavascript', function () { return gulp.src([ './angular/**/*.js' ]) .pipe(plumber()) .pipe(ngAnnotate()) .pipe(sourcemaps.init()) .pipe(concat('app.js')) .pipe(gulp.dest('./dist/script')) .pipe(uglify()) .pipe(rename('app.min.js')) .pipe(sourcemaps.write('.')) .pipe(gulp.dest('./dist/script')); }); gulp.task('watchApplicationJavascript', ['applicationJavascript'], function () { watch('./angular/**/*.js', batch(function (events, done) { gulp.start('applicationJavascript', done); })); }); gulp.task('watchApplicationCss', ['applicationCss'], function () { watch(['./content/css/site.css', './content/css/animation.css'], batch(function (events, done) { gulp.start('applicationCss', done); })); });