Here are two methods for enabling heterogeneous submission of jobs. These are jobs that may run on a variety of platforms, such as both Windows and Linux. {subsection: If Perl is available on all execute hosts} A single batch script can be defined to work on all Windows and Linux machines. If Perl is available on all potential execute machines, then depend on it, and write a Perl batch script. Name the script with the extension =.pl=, and Windows machines will use this extension to identify and run it as a Perl script. The first line of the Perl script will have =#!=, letting Linux machines know what to do. {subsection: TJ's shabang hack} Three parts to this set up make it work: *: Create a small Windows console application that returns 0. Name this application =#!.exe= {linebreak}{linebreak} Here is C++ source, assuming it is named =success.cpp=, that can be compiled to produce =#!.exe=: {code} // Force the linker to include KERNEL32.LIB #pragma comment(linker, "/defaultlib:kernel32.lib") extern "C" void __stdcall ExitProcess(unsigned int uExitCode); extern "C" void __cdecl begin( void ) { ExitProcess(0); } {endcode} {linebreak} This code could be compiled with the Microsoft C++ compiler like this {verbatim} cl success.cpp /link /subsystem:console /entry:begin kernel32.lib {endverbatim} *: Send file =#!.exe= along with the job. Assuming that this file is in the current working directory at submission, the submit description file will contain {code} should_transfer_files = IF_NEEDED transfer_input_files = #!.exe {endcode} *: The following batch script, named with a =.bat= extension, becomes the executable: {code} #!/bin/bash #!&& @goto windows_part echo 'Linux' ls -l exit 0 :windows_part @echo off @echo Windows dir {endcode} {linebreak} On Linux, this works as a normal bash script; the =exit 0= stops the script before it gets to the label =windows_part=. What Windows sees is a =.bat= file, so it runs in the command shell. The first line is =#!/bin/bash=, and Windows interprets that line as: _run the program_ =#!.exe= _and pass it_ =/bin/bash= _as arguments._ The second line is =#!&& @goto windows_part=, which Windows interprets as: _run the program_ =#!=, _and if it succeeds, goto the_ =windows_part= _label in this script._ So, you have one script, that contains both Linux and Windows commands. It works on Windows as long as you have the program named =#!.exe= in the current directory (or in the path) that returns success.