FreeCOM is the standard FreeDOS command shell that replaces COMMAND.COM from standard DOS.

The main duty of FreeCOM is to prompt the user to enter commands, which are interpreted, processed directly by FreeCOM or executed as executable files.

Those commands processed by FreeCOM directly are called Internal Commands. Non-internal commands which cannot be processed by FreeCOM directly are called External Commands, because FreeCOM will search for files equally named as typed-in.

Besides to implement certain commands FreeCOM offers other features.

Command line usage

COMMAND.COM [ path [ console ] ] [{ option }] [ '/' ( K | C ) commandline ]

If present, the first non-option argument specifies the location in which FreeCOM resides. This location is later stored in the environment variable COMSPEC. Since DOS3+ this option is no longer necessary to find the shell invoked during the boot process, but it may be used to let the system boot a primary shell from one location, but use a shell of the same version from a different location later on.

One shallt not point to a RAMdisk at this time, because FreeCOM needs to reload certain information relatively early during execution, before AUTOEXEC.BAT had been executed, in which, normally, FreeCOM is copied into the RAMdisk.

For convinience FreeCOM checks, if at the given location a FreeCOM exists and is accessable, if not, the given location is ignored. Also, the standard requires to specify a path only, but FreeCOM accepts an absolute filename, so accepting that FreeCOM is not necessarily named COMMAND.COM.

The second non-option argument, if present, specifies the console FreeCOM shall enable. This setting is system-wide and is not limited to FreeCOM or just this particular process tree. In its result, this argument is identical to the CTTY command.

FreeCOM knows the following options:

FreeCOM command line options
Option Meaning
/? Issues a help screen, then exists
/! Enable/disable debugging support, if compiled to FreeCOM
/Y Enables trace/single step mode, deacticated when the user prompt has been reached
/D Disables to parse AUTOEXEC.BAT, even if the /P option is present (usually set by the kernel, when F5 had been pressed during bootup)
/F Enables autofail of Critical Errors; then instead of displaying the Abort/Retry/Ignore/Fail dialog, Critical Errors are automatically answered with Fail
/P Installs a primary copy of FreeCOM. The option may have an argument to specify an alternate name for the AUTOEXEC.BAT script, such as /P:FDAUTO.BAT. This primary shell cannot be terminated with the EXIT command and always executes the AUTOEXEC.BAT script before any other command.
/E Sets another size of the environment segment (such as such as /E:1024) in which all the environment variables are stored
/L Sets the size of the internal command buffer (This option is ignored currently, the internal buffer always defaults to 512 bytes)
/U Sets the size of the internal user input buffer (This option is ignored currently. The input buffer always defaults to 255 bytes, which is the maximum)
/LOW Forces to load FreeCOM low (Currently this option has no effect, because no part of FreeCOM is loaded high)
/MSG Installs the message server (Because the message server is not used nowadays, this option forces to permanently load FreeCOM's messages into memory)
/SWAP Toggles, if to default to swapping or not; due to different default values of this internal flag, it is recommended to always prefix the option with '+' to enable or '-' to disable swapping

The options /K and /C are special cases and do not behave as normal options does. They are exclusive and all characters at the right side of such option (except an optional argument sign) specify a command to execute, e.g.: /C DIR /s, /C=DIR /s, and /CDIR /s do behave exactly the same and execuate the command DIR /s.

If these options are used in conjunction with the /P option, the AUTOEXEC.BAT script is executed prior executing the specified command.

In opposite to /K the /C option does not enter the interactive shell prompt after executing the specified command unless the /P options is present, too.

Boolean options, which can only be enabled or disabled, may be prefixed by '+' to enable or '-' to disable it.

Environment variables

Environment variables can be freely assigned using the SET command, e.g. executing:

SET var1=tecxsgk;jsdgsdflfsjdflkasjf/lasjflas

..assigns this nonsense to the variable var1. Later on, the value of the variable can be used by writing: %var1%, thus, writing the name of the variable enclosed without whitespace by two percent signs. Warning: Environment variables are expanded fully into plain text before the command line is furtherly parsed. If a variable contains an odd number of quotes, the remaining command line must contain the closing quote in order to operate properly. Also see this:

SET var=text del
IF text==%var% GOTO label

The second line looks uninteresting, but once the environment variable has been expanded the line has morphed into:

IF text==text del GOTO label

..not that funny anymore, because the IF command interpretes only the string text==text as condition, but del GOTO label is executed as command.

FreeCOM uses a number of environment variables for its own purpose:

FreeCOM environment variables
Variable Meaning
COMSPEC FreeCOM loads some information on demand, these data are stored in the FreeCOM executable. The value of this environment variable contains the filename FreeCOM shall use. The contents can be changed with the SET command.
DIRCMD Default values for the DIR command. This variable must be changed using the SET command. Any options specified within DIRCMD are prefixing any entered ones.
COPYCMD Default options for the COPY command.
PROMPT FreeCOM prompts the user to enter commands to run, the prompt can be customized by changing the contents of this variable. This variable can be changed using the SET or the PROMPT commands. Latter one includes a detailed description of the format of the prompt string.
PATH When FreeCOM is to execute an external command and this one does not contain no path, FreeCOM searched for the command in a number of paths. These ones are enumerated by the PATH environment variable. This variable can be changed using the SET or the PATH commands. Latter one includes a detailed description of the format of the search path.

There are a number of automatic variables that do not follow the above mentioned syntax and which contents is automatically generated. Unlike the normal variables these automatic variables are constructed of exactly two characters, the first one is a single percent sign and the second one the variable identifier:

FreeCOM automatic variables
Variable Meaning
%? Expands to the current errorlevel, which is the exit code of the previously executed external command.
%0 In batch scripts only: the name of the script currently executed.
%1 .. %9 In batch scripts only: the first through nineth argument passed to the currently executed batch script. If less than nine arguments had been passed to the script, they return an empty string. To access the tenth argument please refer to the SHIFT command.
FOR %v in (..) DO .. A loop over a set of variables, where %v may use any letter, the FOR command creates a new variable, which is valid in the any command following the DO keyword.
%% Expands to a single percent sign.

Internal commands

Internal commands will be processed by FreeCOM directly, they are available to the user without presence of any external files, in fact they hide External Commands named equally. The synopsises of the internal commands are described in a style derived from EBNF.

User prompt

FreeCOM knows two modes: interactive and batch processing.

In interactive mode FreeCOM prompts the user to enter a command, the line is interpreted, parsed and, finally, either rejected because of an error or executed.

In batch processing FreeCOM performs batch scripts, which are more or less a sequence of commands written to a file. Such files may contain any external commands, internal commands and calls to other batch files as well.

Command line syntax

FreeCOM accepts the following command line syntax:

[ ':' ] [ '?' ] [ '@' ] [ '*' ] { command [{ argument | redirection }] : '|' }
redirection ::= ( '<' | '>' | '>>' ) filename

The first optional ? must not be mixed up with the command ?!

The colon marks the line as label, which causes to let FreeCOM ignore the line completely as no interpretation is tried on this line, neither are any redirections created.

The ? forces FreeCOM to enable the trace mode for this line. In trace mode FreeCOM prompts the user wether to execute the resulting command.

The optional @ disables the echo status for this line. If the echo status is enabled, the line is displayed right before it is executed; see ECHO for more details.

The asterisk * is available only, if aliases are compiled into FreeCOM; if present, the alias expansion is skipped.

If commands are chained with the | symbols, those commands are to be executed as a pipe. For instance the command line:

cmd1 | cmd2 | cmd3

..forms a pipe consisting of the three individual commands cmd1, cmd2, and cmd3, where the standard output stream of cmd1 is connected to the standard input stream of cmd2 and the output of cmd2 to the input of cmd3. Note: Because DOS is no multitasking environment, pipes are simulated with file and the three-command pipe will look like this:

cmd1 >%TEMP%\cmd###1.tmp
cmd2 <%TEMP%\cmd###1.tmp >%TEMP%\cmd###2.tmp
cmd3 <%TEMP%\cmd###2.tmp

The files are temporary ones and will be removed as soon as they are no longer required, meaning the tempfile #1 is removed after cmd2 terminates and tempfile #2 upon termination of cmd3.

Redirections tie the standard input or output stream to a file or device, for instance:

cmd arg <infile >>outfile

..redirects the standard input stream of cmd to the file infile and the standard output stream to outfile. The double output redirection specifies to append to an existing file rather than overwriting it.

Command line editing

FreeCOM offers two methods to interactively enter command lines: standard input and enhanced input.

The first one just calls a DOS function, whereas the second one processes each key for its own. Which method FreeCOM uses is defined at compile time.

If the echo state is enabled, the user is prompted with the PROMPT string; otherwise no visible or audible prompt is issued to indicate an user activity request.

In either mode the ENTER key terminates the editing and lets FreeCOM start to interprete the entered line.

The standard input mode does neither support command line history, except the last command line in some circumstances, nor file completion. The following keys have a special meaning:

  • F1 Get next character from last line, if available
  • F3 Get last line, if available
  • F5 Place current line in last-line buffer and restart editing on a blank line
  • F6 Insert the pseudo-character End-of-file
  • backspace delete character to the left
  • cursor left delete character to the left
  • cursor right Get next character from last line, if available

The enhanced input mode does support command line history and file completion. The following keys have a special meaning:

  • F1 Get next character from last line, if available
  • F3 Get last line, if available
  • F5 Place current line in last-line buffer and restart editing on a blank line
  • backspace delete character to the left
  • cursor down Replace the current input line with the previous line from the history
  • cursor left move cursor one character one position to the left
  • cursor right Move cursor one position to the right; at the end of the line get next character from last line, if available
  • cursor up Replace the current input line with the next line from the history
  • delete Deletes the character on the cursor
  • end Moves the cursor to the end of the line
  • ESC Clear current line
  • home moves the cursor to the beginning of the line
  • insert Switch between insert and overwrite mode
  • TAB Take the current word for a file and try to complete it
  • ^C Clear current line and enable echo state. The echo state is enabled to ensure the user gets to know he is on the command line of FreeCOM rather than stuck in a non-interruptable program.


This section is out of date.


FreeCOM implements the following features:

  • FEATURE_ALIASES - Command aliases
  • FEATURE_AUTO_REDIRECT_TO_CON - Autoswitch CON: to monitor
  • FEATURE_BATCH - Batch script processing
  • FEATURE_BOOT_KEYS - check for F5/F8 keys on startup if /P is present
  • FEATURE_CALL_LOGGING - Startup logging
  • FEATURE_DIRSTACK - Directory stack
  • FEATURE_ENHANCED_INPUT - Enhanced command line editing
  • FEATURE_FILENAME_COMPLETION - Filename completion
  • FEATURE_HISTORY - Command line history
  • FEATURE_INSTALLABLE_COMMANDS - Installable Commands interface (MUX-AE)
  • FEATURE_LAST_DIR - Change back to last directory
  • FEATURE_LOAD_MESSAGES - Load messages permanently


This section is out of date.

FreeCOM's development currently targets the v1.0 version, which is to provide all functionality (features) of commonly known COMMAND.COMs at minimum, but probably at the cost of optimization and performance. Note: This list got updated 5/2006 based on observations with 0.82pl3 and 0.84 - some of the features listed as 0.82pl3 might actually have been added even earlier.

Things to do:

  • INT-2E support (to SET master environment etc)
  • Strict error recognition, probably _doserrno based
  • Input/output functions to replace stdio.h by io.h (aka replace FILE*-based I/O by handle-based one)
  • Relocate parts of shell to HMA if DOS=HIGH
  • Code sharing of modules (better maintainability, smaller code)
  • Alternative swap storage areas, for example EMS
  • Swapping to disk without any supporting secondary programs (KSSF.COM and VSPAWN.COM)
  • Redirection / Pipes in conjunction with Swapping
  • Optimize FreeCOM for size
  • Long FileNames (DIR supports LFN and FAT32 statistics in FreeCOM 0.84)

Other things that should be done:

  • Swapping to XMS without helper programs (done?)
  • Wildcards for REN (done?)
  • Same filename pattern matching code / wildcard handling for REN, COPY and DIR (done?)
  • IF /I (case-insensitive) (done?)
  • internal commands (done?)
  • Aliases: ALIAS
  • Command line history: HISTORY
  • Directory stack: DIRS, PUSHD, and POPD
  • MUX-AE interface for shell plugins
  • Enhanced command line editing, file completion
  • Last directory recognition: CD -, CDD -, PUSHD
  • Control Break handler
  • Critical Error handler
  • IF ERRORLEVEL H{letter}
  • Full support for DOS NLS (date/time/number format, sorting...)
  • DIR /O and DIR /A