Skip to content

Repository files navigation

BATCHCOM

BATCHCOM is a Batch Compiler. It compiles DOS batch files (.BAT) into executable DOS programs (.COM). In addition to the normal DOS commands, BATCHCOM supports many extra commands for program flow, variables and screen handling. BATCHCOM was designed to work with DOS 3.30, so some newer command options (found in DOS 5 or 6 and Windows NT, etc.) are not supported. However, with the extra commands, BATCHCOM is like a complete programming language.

Written in Turbo Pascal in 1992. To run this program now, use DosBox-X or VirtualBox.

Usage

BATCHCOM [filename[.bat]] [options]

Options:

 /M - include error messages
/S - use fast CRT screen procedures
/O - overwrite existing files without asking
/E n - environment size (default: 8192 bytes)
/L - list all commands

Supported DOS commands

CommandDescription
BREAK [on/off]Turn BREAK on or off
CALL ...Run a batch file and return to your program
CD/CHDIR ...Change directory
CLSClear the screen or the current window
COMMAND [/c ...]Run COMMAND.COM
COPY ...Copy file(s) (COPY is handled by COMMAND.COM)
DEL/ERASE ...Delete file(s)
DIR [/p][/w]Show a list of files in a directory
ECHO ...Write text to the screen
EXITExit program and return to DOS
FOR %%C in (list) do ...Set the variable %%C to all items of list and perform a command
GOTO labelGo to another line in the batch file (a label is any word after a colon ":")
IF [NOT] EXIST ...If the file exists, then ...
IF ERRORLEVEL x ...If the ERRORLEVEL is x or below x, then ...
IF ... == ...If the two strings are equal, then ...
MD/MKDIR ...Create a new directory
PATH ...Set or show the PATH
PAUSE [...]Wait for a keystroke
PROMPT ...Change the DOS prompt
REM ...Remark
RD/RMDIR ...Remove a directory
REN/RENAME ...Rename a file or a group of files
SET [var=[value]]Set an environment variable (Note: All variables are restored after running the program)
SHIFTMove all parameters (%1, %2, ..) one place back
TYPE ...Show the contents of a file
VERShow the current DOS version
VERIFY [onoff]
VOL ...Show the volume of a drive

Special characters in strings

Available for the commands ECHO, PAUSE, IF and SET:

 $g ">" $q "=" $s <Space>
$l "<" $h <BackSpace> $e <Esc>
$b "|" $_ <CR/LF> $$ "$"
$(n) ASCII number
$ at the end of a line: No <CR>

Variables

Besides the environment variables you may also define up to 100 32-bit variables to work with numbers. You can set these variables to integer numbers in the range -2147483648...+2147483647.

Variable commands

SyntaxDescription
VAR varname [=number]Define a new variable (if no number is specified the variable is set to 0)
LET var = numberSet the variable to a new value
LET var1 = var2Copy the value of var2 into var1
LET var = %1If %1 is not a valid number, the ERRORLEVEL is set to the position of the error
LET var = ERRORLEVELSets var to the current errorlevel
ADD var, xAdd the value of x to var
SUB var, xSubtract the value of x from var
NEG varChange the sign of var (+/-)
ABS varIf var < 0 then the sign is changed
MUL var, xMultiply var with x
DIV var, xInteger division

Writing variable numbers

 ECHO ... %VAR% ... Show the number of VAR (decimal)
ECHO %VAR:10% Use 10 spaces for the number (like this: " 123")
ECHO %VAR:-10% Spaces after the number ("123 ")
ECHO %VAR:010% Use "0" instead of spaces ("0000000123")
ECHO %VAR:b% Show the binary value ("1111011")
ECHO %VAR:X% Show the hexadecimal value ("7B")
ECHO %VAR:x% The same, but use lowercase letters ("7b")
ECHO %VAR:o% Show the octal value (173)

Comparing variables

 IF %var1% = %var2% ... If the two variables are the same then ...
IF %var1% <> %var2% .. If the variables are different then ...
IF %var1% > %var2% ... If var1 is larger than var2 then ...
IF %var1% < %var2% ... If var1 is smaller than var2 then ...
IF %var1% >= %var2% .. If var1 is larger than or equal to var2 then ...
IF %var1% <= %var2% .. If var1 is smaller than or equal to var2 then ...
  • You may always insert the word NOT to reverse the condition
  • If you compare strings with <, >, <= or >=, first the length is compared

GOSUB and RETURN

You can create subroutines in your programs by using these commands. Example:

 GoTo Start
:Proc1
...
Return
:Start
...
GoSub Proc1
...
GoSub Proc1

You can run the same procedure as often as you like without having to write it again.

  • NOTE: Never go to a subroutine using the GOTO command.
  • RETURN without GOSUB could cause the system to crach.

Other commands

CommandDescription
CRTAfter this command all the output to screen is written directly to the video buffer
DOSUse DOS routines to handle output to screen
SETCOLOR nChange the attribute. Only if CRT procedures are installed (valid attributes are 0..255 or $00..$FF)
MOVETO x, yChange the position of the cursor
SETWINDOW x1, y1, x2, y2Define a window (Use this command before CLS, FILLWINDOW, FRAMEWIN, MENU, SCROLL). Default: 1, 1, 80, 25
SCROLL nScroll the current window n lines up (or down: n < 0)
FRAMEWINDOW chars, titleDraw a frame in the current window. Chars is either DOUBLEFRAME or SINGLEFRAME or the characters to be used in the frame, eg. ╔═╗║║╚═╝. Title is any text
FILLWINDOW nFills the window with one character (n = 0..255)
CHECKANSISet the errorlevel to 1 if ANSI.SYS is installed
GETSCREENSave the contents of the entire screen in memory
PUTSCREENRestores the last screen saved by GETSCREEN or LOADSCREEN
SAVESCREEN fileSave a screen to the disk
LOADSCREEN fileLoad a screen from the disk into memory (use PUTSCREEN to display it)
COUNTPARAMSSet the errorlevel to the number of parameters

Menus

MENU [c1,] [c2,] [c3,] "[" ~O~ption1 "/" O~p~tion2 [/...] "]" [";"]
c1 Attribute of highlighted bar
c2 Attribute of hot keys
c3 Attribute of hot key in highlighted bar
~X~ Hot key
";" Return if the user presses <-- or --> (errorlevel 254, 255)

If the user presses a hot key or , the errorlevel will be set to the number of the option. If is pressed the errorlevel is set to 0. Example:

Cls
SetWindow 10, 5, 20, 9
FrameWindow SingleFrame, Menu SetWindow 11, 6, 19, 8
Menu $70, $0F, $70, [ ~E~dit / ~R~un / ~Q~uit ]
if ErrorLevel 3 GoTo Quit
if ErrorLevel 2 GoTo Run
...

Input and other commands / functions:

CommandDescription
ASK ["prompt"], keylistSet the errorlevel to the position in the list
ASKYN ["prompt"]Yes: errorlevel = 1, No errorlevel = 0
GETKEYSet the errorlevel to the ASCII value of a keystroke
GETKBFLAGSSet the errorlevel to the keyboard flags byte
SETKBFLAGS Change the keyboard flags
SETBIT n Set bit n of to 1
RESETBIT n Set bit n of to 0
GETBIT n Set the errorlevel to the value of bit n of (see keyboard flag bits table below)
INPUT Input any environment variable (from the keyboard)
IF KEYPRESSED ...If the user has pressed any key on the keyboard then ...
GETX Store the cursor position in a variable
GETY Store the cursor line in a variable
GETCURSOR Store the cursor size in a variable
SETCURSOR Set the size of the cursor (default $0B0C, block cursor: $001F, no cursor: $1F00)
DISKFREE Get the free space on a disk into a variable
UPPERCASE Change all letters in a variable to capitals
LOWERCASE Change the capitals into lowercase letters
GETDRIVE Set an environment variable to the current drive
GETDIR Set a variable to the current directory
GETDAY Set a variable to the day of the week
GETDATE Set a variable to the current date
GETTIME Set a variable to the current time
GETLENGTH Set the errorlevel to the length of the var
CHECKERRORS ONoff
BEEPMake a short sound.
GETRANDOMSet the errorlevel to a random number (0..255)
WRITECHAR n1 [,n2]Write 1 (or n2) character(s) with ASCII code n1
INLINE n1, n2, ...Use machine language in your programs (Hex numbers only), for example "INLINE cd 05" will print the screen. An INLINE procedure may destroy the values of the registers AX, BX, CX, DX, SI, DI and BP. The other registers must be restored.
 Keyboard flag bits:
76543210
.......1 Right Shift key pressed
......1. Left Shift key pressed
.....1.. Ctrl key pressed
....1... Alt key pressed
...1.... ScrollLock on
..1..... NumLock on
.1...... CapsLock on
1....... Insert mode on

Example for CheckErrors:

 CheckErrors OFF
ChDir %1
if ErrorLevel 1 Echo THERE IS NO DIRECTORY NAMED "%1".

There are two ways to run an external program:

  • Type only the name. A copy of COMMAND.COM is loaded and searches all directories of the PATH for the program. If the program is not found, you will get the message "Bad command or filename".
  • Type the full pathname and extension ("C:\UTIL\BC.EXE"). Use this method if you want to know what errorlevel is left by the program.

EXAMPLES

To learn more about BATCHCOM, take a look at the examples in the EXAMPLES folder. BATCHCOM programs usually have the extension .BC, because they can't be run as normal .BAT files.

TINY

The program TINY compresses .COM programs to make them even smaller.

About

Compiler for DOS batch files written in 1992 (creates .COM programs from .BAT or .BC files)

Topics

Resources

Stars

7 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
 blocks
(function() {
function addCopyButtons() {
document.querySelectorAll('pre code').forEach(function(codeBlock) {
if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
codeBlock.parentElement.setAttribute('data-copy-added', 'true');
var btn = document.createElement('button');
btn.textContent = 'Copy';
btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';
btn.onmouseover = function() { this.style.opacity = '1'; };
btn.onmouseout = function() { this.style.opacity = '0.7'; };
btn.onclick = function() {
navigator.clipboard.writeText(codeBlock.textContent).then(function() {
btn.textContent = 'Copied!';
setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
});
};
codeBlock.parentElement.style.position = 'relative';
codeBlock.parentElement.appendChild(btn);
});
}
addCopyButtons();
// Re-run on dynamic content
var observer = new MutationObserver(addCopyButtons);
observer.observe(document.body, { childList: true, subtree: true });
})();
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
GitHub - Wiering/BatchCom: Compiler for DOS batch files written in 1992 (creates .COM programs from .BAT or .BC files) · GitHub
Skip to content

Repository files navigation

BATCHCOM

BATCHCOM is a Batch Compiler. It compiles DOS batch files (.BAT) into executable DOS programs (.COM). In addition to the normal DOS commands, BATCHCOM supports many extra commands for program flow, variables and screen handling. BATCHCOM was designed to work with DOS 3.30, so some newer command options (found in DOS 5 or 6 and Windows NT, etc.) are not supported. However, with the extra commands, BATCHCOM is like a complete programming language.

Written in Turbo Pascal in 1992. To run this program now, use DosBox-X or VirtualBox.

Usage

BATCHCOM [filename[.bat]] [options]

Options:

 /M - include error messages
/S - use fast CRT screen procedures
/O - overwrite existing files without asking
/E n - environment size (default: 8192 bytes)
/L - list all commands

Supported DOS commands

CommandDescription
BREAK [on/off]Turn BREAK on or off
CALL ...Run a batch file and return to your program
CD/CHDIR ...Change directory
CLSClear the screen or the current window
COMMAND [/c ...]Run COMMAND.COM
COPY ...Copy file(s) (COPY is handled by COMMAND.COM)
DEL/ERASE ...Delete file(s)
DIR [/p][/w]Show a list of files in a directory
ECHO ...Write text to the screen
EXITExit program and return to DOS
FOR %%C in (list) do ...Set the variable %%C to all items of list and perform a command
GOTO labelGo to another line in the batch file (a label is any word after a colon ":")
IF [NOT] EXIST ...If the file exists, then ...
IF ERRORLEVEL x ...If the ERRORLEVEL is x or below x, then ...
IF ... == ...If the two strings are equal, then ...
MD/MKDIR ...Create a new directory
PATH ...Set or show the PATH
PAUSE [...]Wait for a keystroke
PROMPT ...Change the DOS prompt
REM ...Remark
RD/RMDIR ...Remove a directory
REN/RENAME ...Rename a file or a group of files
SET [var=[value]]Set an environment variable (Note: All variables are restored after running the program)
SHIFTMove all parameters (%1, %2, ..) one place back
TYPE ...Show the contents of a file
VERShow the current DOS version
VERIFY [onoff]
VOL ...Show the volume of a drive

Special characters in strings

Available for the commands ECHO, PAUSE, IF and SET:

 $g ">" $q "=" $s <Space>
$l "<" $h <BackSpace> $e <Esc>
$b "|" $_ <CR/LF> $$ "$"
$(n) ASCII number
$ at the end of a line: No <CR>

Variables

Besides the environment variables you may also define up to 100 32-bit variables to work with numbers. You can set these variables to integer numbers in the range -2147483648...+2147483647.

Variable commands

SyntaxDescription
VAR varname [=number]Define a new variable (if no number is specified the variable is set to 0)
LET var = numberSet the variable to a new value
LET var1 = var2Copy the value of var2 into var1
LET var = %1If %1 is not a valid number, the ERRORLEVEL is set to the position of the error
LET var = ERRORLEVELSets var to the current errorlevel
ADD var, xAdd the value of x to var
SUB var, xSubtract the value of x from var
NEG varChange the sign of var (+/-)
ABS varIf var < 0 then the sign is changed
MUL var, xMultiply var with x
DIV var, xInteger division

Writing variable numbers

 ECHO ... %VAR% ... Show the number of VAR (decimal)
ECHO %VAR:10% Use 10 spaces for the number (like this: " 123")
ECHO %VAR:-10% Spaces after the number ("123 ")
ECHO %VAR:010% Use "0" instead of spaces ("0000000123")
ECHO %VAR:b% Show the binary value ("1111011")
ECHO %VAR:X% Show the hexadecimal value ("7B")
ECHO %VAR:x% The same, but use lowercase letters ("7b")
ECHO %VAR:o% Show the octal value (173)

Comparing variables

 IF %var1% = %var2% ... If the two variables are the same then ...
IF %var1% <> %var2% .. If the variables are different then ...
IF %var1% > %var2% ... If var1 is larger than var2 then ...
IF %var1% < %var2% ... If var1 is smaller than var2 then ...
IF %var1% >= %var2% .. If var1 is larger than or equal to var2 then ...
IF %var1% <= %var2% .. If var1 is smaller than or equal to var2 then ...
  • You may always insert the word NOT to reverse the condition
  • If you compare strings with <, >, <= or >=, first the length is compared

GOSUB and RETURN

You can create subroutines in your programs by using these commands. Example:

 GoTo Start
:Proc1
...
Return
:Start
...
GoSub Proc1
...
GoSub Proc1

You can run the same procedure as often as you like without having to write it again.

  • NOTE: Never go to a subroutine using the GOTO command.
  • RETURN without GOSUB could cause the system to crach.

Other commands

CommandDescription
CRTAfter this command all the output to screen is written directly to the video buffer
DOSUse DOS routines to handle output to screen
SETCOLOR nChange the attribute. Only if CRT procedures are installed (valid attributes are 0..255 or $00..$FF)
MOVETO x, yChange the position of the cursor
SETWINDOW x1, y1, x2, y2Define a window (Use this command before CLS, FILLWINDOW, FRAMEWIN, MENU, SCROLL). Default: 1, 1, 80, 25
SCROLL nScroll the current window n lines up (or down: n < 0)
FRAMEWINDOW chars, titleDraw a frame in the current window. Chars is either DOUBLEFRAME or SINGLEFRAME or the characters to be used in the frame, eg. ╔═╗║║╚═╝. Title is any text
FILLWINDOW nFills the window with one character (n = 0..255)
CHECKANSISet the errorlevel to 1 if ANSI.SYS is installed
GETSCREENSave the contents of the entire screen in memory
PUTSCREENRestores the last screen saved by GETSCREEN or LOADSCREEN
SAVESCREEN fileSave a screen to the disk
LOADSCREEN fileLoad a screen from the disk into memory (use PUTSCREEN to display it)
COUNTPARAMSSet the errorlevel to the number of parameters

Menus

MENU [c1,] [c2,] [c3,] "[" ~O~ption1 "/" O~p~tion2 [/...] "]" [";"]
c1 Attribute of highlighted bar
c2 Attribute of hot keys
c3 Attribute of hot key in highlighted bar
~X~ Hot key
";" Return if the user presses <-- or --> (errorlevel 254, 255)

If the user presses a hot key or , the errorlevel will be set to the number of the option. If is pressed the errorlevel is set to 0. Example:

Cls
SetWindow 10, 5, 20, 9
FrameWindow SingleFrame, Menu SetWindow 11, 6, 19, 8
Menu $70, $0F, $70, [ ~E~dit / ~R~un / ~Q~uit ]
if ErrorLevel 3 GoTo Quit
if ErrorLevel 2 GoTo Run
...

Input and other commands / functions:

CommandDescription
ASK ["prompt"], keylistSet the errorlevel to the position in the list
ASKYN ["prompt"]Yes: errorlevel = 1, No errorlevel = 0
GETKEYSet the errorlevel to the ASCII value of a keystroke
GETKBFLAGSSet the errorlevel to the keyboard flags byte
SETKBFLAGS Change the keyboard flags
SETBIT n Set bit n of to 1
RESETBIT n Set bit n of to 0
GETBIT n Set the errorlevel to the value of bit n of (see keyboard flag bits table below)
INPUT Input any environment variable (from the keyboard)
IF KEYPRESSED ...If the user has pressed any key on the keyboard then ...
GETX Store the cursor position in a variable
GETY Store the cursor line in a variable
GETCURSOR Store the cursor size in a variable
SETCURSOR Set the size of the cursor (default $0B0C, block cursor: $001F, no cursor: $1F00)
DISKFREE Get the free space on a disk into a variable
UPPERCASE Change all letters in a variable to capitals
LOWERCASE Change the capitals into lowercase letters
GETDRIVE Set an environment variable to the current drive
GETDIR Set a variable to the current directory
GETDAY Set a variable to the day of the week
GETDATE Set a variable to the current date
GETTIME Set a variable to the current time
GETLENGTH Set the errorlevel to the length of the var
CHECKERRORS ONoff
BEEPMake a short sound.
GETRANDOMSet the errorlevel to a random number (0..255)
WRITECHAR n1 [,n2]Write 1 (or n2) character(s) with ASCII code n1
INLINE n1, n2, ...Use machine language in your programs (Hex numbers only), for example "INLINE cd 05" will print the screen. An INLINE procedure may destroy the values of the registers AX, BX, CX, DX, SI, DI and BP. The other registers must be restored.
 Keyboard flag bits:
76543210
.......1 Right Shift key pressed
......1. Left Shift key pressed
.....1.. Ctrl key pressed
....1... Alt key pressed
...1.... ScrollLock on
..1..... NumLock on
.1...... CapsLock on
1....... Insert mode on

Example for CheckErrors:

 CheckErrors OFF
ChDir %1
if ErrorLevel 1 Echo THERE IS NO DIRECTORY NAMED "%1".

There are two ways to run an external program:

  • Type only the name. A copy of COMMAND.COM is loaded and searches all directories of the PATH for the program. If the program is not found, you will get the message "Bad command or filename".
  • Type the full pathname and extension ("C:\UTIL\BC.EXE"). Use this method if you want to know what errorlevel is left by the program.

EXAMPLES

To learn more about BATCHCOM, take a look at the examples in the EXAMPLES folder. BATCHCOM programs usually have the extension .BC, because they can't be run as normal .BAT files.

TINY

The program TINY compresses .COM programs to make them even smaller.

About

Compiler for DOS batch files written in 1992 (creates .COM programs from .BAT or .BC files)

Topics

Resources

Stars

7 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Force GitHub README to respect dark mode (function() { var style = document.createElement('style'); style.textContent = ' .markdown-body { color-scheme: dark light; } .markdown-body pre { background: #161b22 !important; } .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; } .markdown-body table th, .markdown-body table td { border-color: #30363d !important; } .markdown-body img { background: #0d1117; } .markdown-body blockquote { border-left-color: #8b949e; } .markdown-body hr { border-color: #30363d; } '; document.head.appendChild(style); })(); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - Wiering/BatchCom: Compiler for DOS batch files written in 1992 (creates .COM programs from .BAT or .BC files) · GitHub
Skip to content

Repository files navigation

BATCHCOM

BATCHCOM is a Batch Compiler. It compiles DOS batch files (.BAT) into executable DOS programs (.COM). In addition to the normal DOS commands, BATCHCOM supports many extra commands for program flow, variables and screen handling. BATCHCOM was designed to work with DOS 3.30, so some newer command options (found in DOS 5 or 6 and Windows NT, etc.) are not supported. However, with the extra commands, BATCHCOM is like a complete programming language.

Written in Turbo Pascal in 1992. To run this program now, use DosBox-X or VirtualBox.

Usage

BATCHCOM [filename[.bat]] [options]

Options:

 /M - include error messages
/S - use fast CRT screen procedures
/O - overwrite existing files without asking
/E n - environment size (default: 8192 bytes)
/L - list all commands

Supported DOS commands

CommandDescription
BREAK [on/off]Turn BREAK on or off
CALL ...Run a batch file and return to your program
CD/CHDIR ...Change directory
CLSClear the screen or the current window
COMMAND [/c ...]Run COMMAND.COM
COPY ...Copy file(s) (COPY is handled by COMMAND.COM)
DEL/ERASE ...Delete file(s)
DIR [/p][/w]Show a list of files in a directory
ECHO ...Write text to the screen
EXITExit program and return to DOS
FOR %%C in (list) do ...Set the variable %%C to all items of list and perform a command
GOTO labelGo to another line in the batch file (a label is any word after a colon ":")
IF [NOT] EXIST ...If the file exists, then ...
IF ERRORLEVEL x ...If the ERRORLEVEL is x or below x, then ...
IF ... == ...If the two strings are equal, then ...
MD/MKDIR ...Create a new directory
PATH ...Set or show the PATH
PAUSE [...]Wait for a keystroke
PROMPT ...Change the DOS prompt
REM ...Remark
RD/RMDIR ...Remove a directory
REN/RENAME ...Rename a file or a group of files
SET [var=[value]]Set an environment variable (Note: All variables are restored after running the program)
SHIFTMove all parameters (%1, %2, ..) one place back
TYPE ...Show the contents of a file
VERShow the current DOS version
VERIFY [onoff]
VOL ...Show the volume of a drive

Special characters in strings

Available for the commands ECHO, PAUSE, IF and SET:

 $g ">" $q "=" $s <Space>
$l "<" $h <BackSpace> $e <Esc>
$b "|" $_ <CR/LF> $$ "$"
$(n) ASCII number
$ at the end of a line: No <CR>

Variables

Besides the environment variables you may also define up to 100 32-bit variables to work with numbers. You can set these variables to integer numbers in the range -2147483648...+2147483647.

Variable commands

SyntaxDescription
VAR varname [=number]Define a new variable (if no number is specified the variable is set to 0)
LET var = numberSet the variable to a new value
LET var1 = var2Copy the value of var2 into var1
LET var = %1If %1 is not a valid number, the ERRORLEVEL is set to the position of the error
LET var = ERRORLEVELSets var to the current errorlevel
ADD var, xAdd the value of x to var
SUB var, xSubtract the value of x from var
NEG varChange the sign of var (+/-)
ABS varIf var < 0 then the sign is changed
MUL var, xMultiply var with x
DIV var, xInteger division

Writing variable numbers

 ECHO ... %VAR% ... Show the number of VAR (decimal)
ECHO %VAR:10% Use 10 spaces for the number (like this: " 123")
ECHO %VAR:-10% Spaces after the number ("123 ")
ECHO %VAR:010% Use "0" instead of spaces ("0000000123")
ECHO %VAR:b% Show the binary value ("1111011")
ECHO %VAR:X% Show the hexadecimal value ("7B")
ECHO %VAR:x% The same, but use lowercase letters ("7b")
ECHO %VAR:o% Show the octal value (173)

Comparing variables

 IF %var1% = %var2% ... If the two variables are the same then ...
IF %var1% <> %var2% .. If the variables are different then ...
IF %var1% > %var2% ... If var1 is larger than var2 then ...
IF %var1% < %var2% ... If var1 is smaller than var2 then ...
IF %var1% >= %var2% .. If var1 is larger than or equal to var2 then ...
IF %var1% <= %var2% .. If var1 is smaller than or equal to var2 then ...
  • You may always insert the word NOT to reverse the condition
  • If you compare strings with <, >, <= or >=, first the length is compared

GOSUB and RETURN

You can create subroutines in your programs by using these commands. Example:

 GoTo Start
:Proc1
...
Return
:Start
...
GoSub Proc1
...
GoSub Proc1

You can run the same procedure as often as you like without having to write it again.

  • NOTE: Never go to a subroutine using the GOTO command.
  • RETURN without GOSUB could cause the system to crach.

Other commands

CommandDescription
CRTAfter this command all the output to screen is written directly to the video buffer
DOSUse DOS routines to handle output to screen
SETCOLOR nChange the attribute. Only if CRT procedures are installed (valid attributes are 0..255 or $00..$FF)
MOVETO x, yChange the position of the cursor
SETWINDOW x1, y1, x2, y2Define a window (Use this command before CLS, FILLWINDOW, FRAMEWIN, MENU, SCROLL). Default: 1, 1, 80, 25
SCROLL nScroll the current window n lines up (or down: n < 0)
FRAMEWINDOW chars, titleDraw a frame in the current window. Chars is either DOUBLEFRAME or SINGLEFRAME or the characters to be used in the frame, eg. ╔═╗║║╚═╝. Title is any text
FILLWINDOW nFills the window with one character (n = 0..255)
CHECKANSISet the errorlevel to 1 if ANSI.SYS is installed
GETSCREENSave the contents of the entire screen in memory
PUTSCREENRestores the last screen saved by GETSCREEN or LOADSCREEN
SAVESCREEN fileSave a screen to the disk
LOADSCREEN fileLoad a screen from the disk into memory (use PUTSCREEN to display it)
COUNTPARAMSSet the errorlevel to the number of parameters

Menus

MENU [c1,] [c2,] [c3,] "[" ~O~ption1 "/" O~p~tion2 [/...] "]" [";"]
c1 Attribute of highlighted bar
c2 Attribute of hot keys
c3 Attribute of hot key in highlighted bar
~X~ Hot key
";" Return if the user presses <-- or --> (errorlevel 254, 255)

If the user presses a hot key or , the errorlevel will be set to the number of the option. If is pressed the errorlevel is set to 0. Example:

Cls
SetWindow 10, 5, 20, 9
FrameWindow SingleFrame, Menu SetWindow 11, 6, 19, 8
Menu $70, $0F, $70, [ ~E~dit / ~R~un / ~Q~uit ]
if ErrorLevel 3 GoTo Quit
if ErrorLevel 2 GoTo Run
...

Input and other commands / functions:

CommandDescription
ASK ["prompt"], keylistSet the errorlevel to the position in the list
ASKYN ["prompt"]Yes: errorlevel = 1, No errorlevel = 0
GETKEYSet the errorlevel to the ASCII value of a keystroke
GETKBFLAGSSet the errorlevel to the keyboard flags byte
SETKBFLAGS Change the keyboard flags
SETBIT n Set bit n of to 1
RESETBIT n Set bit n of to 0
GETBIT n Set the errorlevel to the value of bit n of (see keyboard flag bits table below)
INPUT Input any environment variable (from the keyboard)
IF KEYPRESSED ...If the user has pressed any key on the keyboard then ...
GETX Store the cursor position in a variable
GETY Store the cursor line in a variable
GETCURSOR Store the cursor size in a variable
SETCURSOR Set the size of the cursor (default $0B0C, block cursor: $001F, no cursor: $1F00)
DISKFREE Get the free space on a disk into a variable
UPPERCASE Change all letters in a variable to capitals
LOWERCASE Change the capitals into lowercase letters
GETDRIVE Set an environment variable to the current drive
GETDIR Set a variable to the current directory
GETDAY Set a variable to the day of the week
GETDATE Set a variable to the current date
GETTIME Set a variable to the current time
GETLENGTH Set the errorlevel to the length of the var
CHECKERRORS ONoff
BEEPMake a short sound.
GETRANDOMSet the errorlevel to a random number (0..255)
WRITECHAR n1 [,n2]Write 1 (or n2) character(s) with ASCII code n1
INLINE n1, n2, ...Use machine language in your programs (Hex numbers only), for example "INLINE cd 05" will print the screen. An INLINE procedure may destroy the values of the registers AX, BX, CX, DX, SI, DI and BP. The other registers must be restored.
 Keyboard flag bits:
76543210
.......1 Right Shift key pressed
......1. Left Shift key pressed
.....1.. Ctrl key pressed
....1... Alt key pressed
...1.... ScrollLock on
..1..... NumLock on
.1...... CapsLock on
1....... Insert mode on

Example for CheckErrors:

 CheckErrors OFF
ChDir %1
if ErrorLevel 1 Echo THERE IS NO DIRECTORY NAMED "%1".

There are two ways to run an external program:

  • Type only the name. A copy of COMMAND.COM is loaded and searches all directories of the PATH for the program. If the program is not found, you will get the message "Bad command or filename".
  • Type the full pathname and extension ("C:\UTIL\BC.EXE"). Use this method if you want to know what errorlevel is left by the program.

EXAMPLES

To learn more about BATCHCOM, take a look at the examples in the EXAMPLES folder. BATCHCOM programs usually have the extension .BC, because they can't be run as normal .BAT files.

TINY

The program TINY compresses .COM programs to make them even smaller.

About

Compiler for DOS batch files written in 1992 (creates .COM programs from .BAT or .BC files)

Topics

Resources

Stars

7 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Highlight search terms from Google/DuckDuckGo/Bing referrer (function() { var ref = document.referrer; var terms = []; if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) { var url = new URL(ref); var q = url.searchParams.get('q') || url.searchParams.get('p'); if (q) { terms = q.split(/\s+/).filter(function(t) { return t.length > 2; }); } } if (terms.length === 0) return; var style = document.createElement('style'); style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }'; document.head.appendChild(style); function highlight(node) { if (node.nodeType === 3) { // text node var text = node.textContent; var found = false; terms.forEach(function(term) { var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\]\\]/g, '\\') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - Wiering/BatchCom: Compiler for DOS batch files written in 1992 (creates .COM programs from .BAT or .BC files) · GitHub
Skip to content

Repository files navigation

BATCHCOM

BATCHCOM is a Batch Compiler. It compiles DOS batch files (.BAT) into executable DOS programs (.COM). In addition to the normal DOS commands, BATCHCOM supports many extra commands for program flow, variables and screen handling. BATCHCOM was designed to work with DOS 3.30, so some newer command options (found in DOS 5 or 6 and Windows NT, etc.) are not supported. However, with the extra commands, BATCHCOM is like a complete programming language.

Written in Turbo Pascal in 1992. To run this program now, use DosBox-X or VirtualBox.

Usage

BATCHCOM [filename[.bat]] [options]

Options:

 /M - include error messages
/S - use fast CRT screen procedures
/O - overwrite existing files without asking
/E n - environment size (default: 8192 bytes)
/L - list all commands

Supported DOS commands

CommandDescription
BREAK [on/off]Turn BREAK on or off
CALL ...Run a batch file and return to your program
CD/CHDIR ...Change directory
CLSClear the screen or the current window
COMMAND [/c ...]Run COMMAND.COM
COPY ...Copy file(s) (COPY is handled by COMMAND.COM)
DEL/ERASE ...Delete file(s)
DIR [/p][/w]Show a list of files in a directory
ECHO ...Write text to the screen
EXITExit program and return to DOS
FOR %%C in (list) do ...Set the variable %%C to all items of list and perform a command
GOTO labelGo to another line in the batch file (a label is any word after a colon ":")
IF [NOT] EXIST ...If the file exists, then ...
IF ERRORLEVEL x ...If the ERRORLEVEL is x or below x, then ...
IF ... == ...If the two strings are equal, then ...
MD/MKDIR ...Create a new directory
PATH ...Set or show the PATH
PAUSE [...]Wait for a keystroke
PROMPT ...Change the DOS prompt
REM ...Remark
RD/RMDIR ...Remove a directory
REN/RENAME ...Rename a file or a group of files
SET [var=[value]]Set an environment variable (Note: All variables are restored after running the program)
SHIFTMove all parameters (%1, %2, ..) one place back
TYPE ...Show the contents of a file
VERShow the current DOS version
VERIFY [onoff]
VOL ...Show the volume of a drive

Special characters in strings

Available for the commands ECHO, PAUSE, IF and SET:

 $g ">" $q "=" $s <Space>
$l "<" $h <BackSpace> $e <Esc>
$b "|" $_ <CR/LF> $$ "$"
$(n) ASCII number
$ at the end of a line: No <CR>

Variables

Besides the environment variables you may also define up to 100 32-bit variables to work with numbers. You can set these variables to integer numbers in the range -2147483648...+2147483647.

Variable commands

SyntaxDescription
VAR varname [=number]Define a new variable (if no number is specified the variable is set to 0)
LET var = numberSet the variable to a new value
LET var1 = var2Copy the value of var2 into var1
LET var = %1If %1 is not a valid number, the ERRORLEVEL is set to the position of the error
LET var = ERRORLEVELSets var to the current errorlevel
ADD var, xAdd the value of x to var
SUB var, xSubtract the value of x from var
NEG varChange the sign of var (+/-)
ABS varIf var < 0 then the sign is changed
MUL var, xMultiply var with x
DIV var, xInteger division

Writing variable numbers

 ECHO ... %VAR% ... Show the number of VAR (decimal)
ECHO %VAR:10% Use 10 spaces for the number (like this: " 123")
ECHO %VAR:-10% Spaces after the number ("123 ")
ECHO %VAR:010% Use "0" instead of spaces ("0000000123")
ECHO %VAR:b% Show the binary value ("1111011")
ECHO %VAR:X% Show the hexadecimal value ("7B")
ECHO %VAR:x% The same, but use lowercase letters ("7b")
ECHO %VAR:o% Show the octal value (173)

Comparing variables

 IF %var1% = %var2% ... If the two variables are the same then ...
IF %var1% <> %var2% .. If the variables are different then ...
IF %var1% > %var2% ... If var1 is larger than var2 then ...
IF %var1% < %var2% ... If var1 is smaller than var2 then ...
IF %var1% >= %var2% .. If var1 is larger than or equal to var2 then ...
IF %var1% <= %var2% .. If var1 is smaller than or equal to var2 then ...
  • You may always insert the word NOT to reverse the condition
  • If you compare strings with <, >, <= or >=, first the length is compared

GOSUB and RETURN

You can create subroutines in your programs by using these commands. Example:

 GoTo Start
:Proc1
...
Return
:Start
...
GoSub Proc1
...
GoSub Proc1

You can run the same procedure as often as you like without having to write it again.

  • NOTE: Never go to a subroutine using the GOTO command.
  • RETURN without GOSUB could cause the system to crach.

Other commands

CommandDescription
CRTAfter this command all the output to screen is written directly to the video buffer
DOSUse DOS routines to handle output to screen
SETCOLOR nChange the attribute. Only if CRT procedures are installed (valid attributes are 0..255 or $00..$FF)
MOVETO x, yChange the position of the cursor
SETWINDOW x1, y1, x2, y2Define a window (Use this command before CLS, FILLWINDOW, FRAMEWIN, MENU, SCROLL). Default: 1, 1, 80, 25
SCROLL nScroll the current window n lines up (or down: n < 0)
FRAMEWINDOW chars, titleDraw a frame in the current window. Chars is either DOUBLEFRAME or SINGLEFRAME or the characters to be used in the frame, eg. ╔═╗║║╚═╝. Title is any text
FILLWINDOW nFills the window with one character (n = 0..255)
CHECKANSISet the errorlevel to 1 if ANSI.SYS is installed
GETSCREENSave the contents of the entire screen in memory
PUTSCREENRestores the last screen saved by GETSCREEN or LOADSCREEN
SAVESCREEN fileSave a screen to the disk
LOADSCREEN fileLoad a screen from the disk into memory (use PUTSCREEN to display it)
COUNTPARAMSSet the errorlevel to the number of parameters

Menus

MENU [c1,] [c2,] [c3,] "[" ~O~ption1 "/" O~p~tion2 [/...] "]" [";"]
c1 Attribute of highlighted bar
c2 Attribute of hot keys
c3 Attribute of hot key in highlighted bar
~X~ Hot key
";" Return if the user presses <-- or --> (errorlevel 254, 255)

If the user presses a hot key or , the errorlevel will be set to the number of the option. If is pressed the errorlevel is set to 0. Example:

Cls
SetWindow 10, 5, 20, 9
FrameWindow SingleFrame, Menu SetWindow 11, 6, 19, 8
Menu $70, $0F, $70, [ ~E~dit / ~R~un / ~Q~uit ]
if ErrorLevel 3 GoTo Quit
if ErrorLevel 2 GoTo Run
...

Input and other commands / functions:

CommandDescription
ASK ["prompt"], keylistSet the errorlevel to the position in the list
ASKYN ["prompt"]Yes: errorlevel = 1, No errorlevel = 0
GETKEYSet the errorlevel to the ASCII value of a keystroke
GETKBFLAGSSet the errorlevel to the keyboard flags byte
SETKBFLAGS Change the keyboard flags
SETBIT n Set bit n of to 1
RESETBIT n Set bit n of to 0
GETBIT n Set the errorlevel to the value of bit n of (see keyboard flag bits table below)
INPUT Input any environment variable (from the keyboard)
IF KEYPRESSED ...If the user has pressed any key on the keyboard then ...
GETX Store the cursor position in a variable
GETY Store the cursor line in a variable
GETCURSOR Store the cursor size in a variable
SETCURSOR Set the size of the cursor (default $0B0C, block cursor: $001F, no cursor: $1F00)
DISKFREE Get the free space on a disk into a variable
UPPERCASE Change all letters in a variable to capitals
LOWERCASE Change the capitals into lowercase letters
GETDRIVE Set an environment variable to the current drive
GETDIR Set a variable to the current directory
GETDAY Set a variable to the day of the week
GETDATE Set a variable to the current date
GETTIME Set a variable to the current time
GETLENGTH Set the errorlevel to the length of the var
CHECKERRORS ONoff
BEEPMake a short sound.
GETRANDOMSet the errorlevel to a random number (0..255)
WRITECHAR n1 [,n2]Write 1 (or n2) character(s) with ASCII code n1
INLINE n1, n2, ...Use machine language in your programs (Hex numbers only), for example "INLINE cd 05" will print the screen. An INLINE procedure may destroy the values of the registers AX, BX, CX, DX, SI, DI and BP. The other registers must be restored.
 Keyboard flag bits:
76543210
.......1 Right Shift key pressed
......1. Left Shift key pressed
.....1.. Ctrl key pressed
....1... Alt key pressed
...1.... ScrollLock on
..1..... NumLock on
.1...... CapsLock on
1....... Insert mode on

Example for CheckErrors:

 CheckErrors OFF
ChDir %1
if ErrorLevel 1 Echo THERE IS NO DIRECTORY NAMED "%1".

There are two ways to run an external program:

  • Type only the name. A copy of COMMAND.COM is loaded and searches all directories of the PATH for the program. If the program is not found, you will get the message "Bad command or filename".
  • Type the full pathname and extension ("C:\UTIL\BC.EXE"). Use this method if you want to know what errorlevel is left by the program.

EXAMPLES

To learn more about BATCHCOM, take a look at the examples in the EXAMPLES folder. BATCHCOM programs usually have the extension .BC, because they can't be run as normal .BAT files.

TINY

The program TINY compresses .COM programs to make them even smaller.

About

Compiler for DOS batch files written in 1992 (creates .COM programs from .BAT or .BC files)

Topics

Resources

Stars

7 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + ' GitHub - Wiering/BatchCom: Compiler for DOS batch files written in 1992 (creates .COM programs from .BAT or .BC files) · GitHub
Skip to content

Repository files navigation

BATCHCOM

BATCHCOM is a Batch Compiler. It compiles DOS batch files (.BAT) into executable DOS programs (.COM). In addition to the normal DOS commands, BATCHCOM supports many extra commands for program flow, variables and screen handling. BATCHCOM was designed to work with DOS 3.30, so some newer command options (found in DOS 5 or 6 and Windows NT, etc.) are not supported. However, with the extra commands, BATCHCOM is like a complete programming language.

Written in Turbo Pascal in 1992. To run this program now, use DosBox-X or VirtualBox.

Usage

BATCHCOM [filename[.bat]] [options]

Options:

 /M - include error messages
/S - use fast CRT screen procedures
/O - overwrite existing files without asking
/E n - environment size (default: 8192 bytes)
/L - list all commands

Supported DOS commands

CommandDescription
BREAK [on/off]Turn BREAK on or off
CALL ...Run a batch file and return to your program
CD/CHDIR ...Change directory
CLSClear the screen or the current window
COMMAND [/c ...]Run COMMAND.COM
COPY ...Copy file(s) (COPY is handled by COMMAND.COM)
DEL/ERASE ...Delete file(s)
DIR [/p][/w]Show a list of files in a directory
ECHO ...Write text to the screen
EXITExit program and return to DOS
FOR %%C in (list) do ...Set the variable %%C to all items of list and perform a command
GOTO labelGo to another line in the batch file (a label is any word after a colon ":")
IF [NOT] EXIST ...If the file exists, then ...
IF ERRORLEVEL x ...If the ERRORLEVEL is x or below x, then ...
IF ... == ...If the two strings are equal, then ...
MD/MKDIR ...Create a new directory
PATH ...Set or show the PATH
PAUSE [...]Wait for a keystroke
PROMPT ...Change the DOS prompt
REM ...Remark
RD/RMDIR ...Remove a directory
REN/RENAME ...Rename a file or a group of files
SET [var=[value]]Set an environment variable (Note: All variables are restored after running the program)
SHIFTMove all parameters (%1, %2, ..) one place back
TYPE ...Show the contents of a file
VERShow the current DOS version
VERIFY [onoff]
VOL ...Show the volume of a drive

Special characters in strings

Available for the commands ECHO, PAUSE, IF and SET:

 $g ">" $q "=" $s <Space>
$l "<" $h <BackSpace> $e <Esc>
$b "|" $_ <CR/LF> $$ "$"
$(n) ASCII number
$ at the end of a line: No <CR>

Variables

Besides the environment variables you may also define up to 100 32-bit variables to work with numbers. You can set these variables to integer numbers in the range -2147483648...+2147483647.

Variable commands

SyntaxDescription
VAR varname [=number]Define a new variable (if no number is specified the variable is set to 0)
LET var = numberSet the variable to a new value
LET var1 = var2Copy the value of var2 into var1
LET var = %1If %1 is not a valid number, the ERRORLEVEL is set to the position of the error
LET var = ERRORLEVELSets var to the current errorlevel
ADD var, xAdd the value of x to var
SUB var, xSubtract the value of x from var
NEG varChange the sign of var (+/-)
ABS varIf var < 0 then the sign is changed
MUL var, xMultiply var with x
DIV var, xInteger division

Writing variable numbers

 ECHO ... %VAR% ... Show the number of VAR (decimal)
ECHO %VAR:10% Use 10 spaces for the number (like this: " 123")
ECHO %VAR:-10% Spaces after the number ("123 ")
ECHO %VAR:010% Use "0" instead of spaces ("0000000123")
ECHO %VAR:b% Show the binary value ("1111011")
ECHO %VAR:X% Show the hexadecimal value ("7B")
ECHO %VAR:x% The same, but use lowercase letters ("7b")
ECHO %VAR:o% Show the octal value (173)

Comparing variables

 IF %var1% = %var2% ... If the two variables are the same then ...
IF %var1% <> %var2% .. If the variables are different then ...
IF %var1% > %var2% ... If var1 is larger than var2 then ...
IF %var1% < %var2% ... If var1 is smaller than var2 then ...
IF %var1% >= %var2% .. If var1 is larger than or equal to var2 then ...
IF %var1% <= %var2% .. If var1 is smaller than or equal to var2 then ...
  • You may always insert the word NOT to reverse the condition
  • If you compare strings with <, >, <= or >=, first the length is compared

GOSUB and RETURN

You can create subroutines in your programs by using these commands. Example:

 GoTo Start
:Proc1
...
Return
:Start
...
GoSub Proc1
...
GoSub Proc1

You can run the same procedure as often as you like without having to write it again.

  • NOTE: Never go to a subroutine using the GOTO command.
  • RETURN without GOSUB could cause the system to crach.

Other commands

CommandDescription
CRTAfter this command all the output to screen is written directly to the video buffer
DOSUse DOS routines to handle output to screen
SETCOLOR nChange the attribute. Only if CRT procedures are installed (valid attributes are 0..255 or $00..$FF)
MOVETO x, yChange the position of the cursor
SETWINDOW x1, y1, x2, y2Define a window (Use this command before CLS, FILLWINDOW, FRAMEWIN, MENU, SCROLL). Default: 1, 1, 80, 25
SCROLL nScroll the current window n lines up (or down: n < 0)
FRAMEWINDOW chars, titleDraw a frame in the current window. Chars is either DOUBLEFRAME or SINGLEFRAME or the characters to be used in the frame, eg. ╔═╗║║╚═╝. Title is any text
FILLWINDOW nFills the window with one character (n = 0..255)
CHECKANSISet the errorlevel to 1 if ANSI.SYS is installed
GETSCREENSave the contents of the entire screen in memory
PUTSCREENRestores the last screen saved by GETSCREEN or LOADSCREEN
SAVESCREEN fileSave a screen to the disk
LOADSCREEN fileLoad a screen from the disk into memory (use PUTSCREEN to display it)
COUNTPARAMSSet the errorlevel to the number of parameters

Menus

MENU [c1,] [c2,] [c3,] "[" ~O~ption1 "/" O~p~tion2 [/...] "]" [";"]
c1 Attribute of highlighted bar
c2 Attribute of hot keys
c3 Attribute of hot key in highlighted bar
~X~ Hot key
";" Return if the user presses <-- or --> (errorlevel 254, 255)

If the user presses a hot key or , the errorlevel will be set to the number of the option. If is pressed the errorlevel is set to 0. Example:

Cls
SetWindow 10, 5, 20, 9
FrameWindow SingleFrame, Menu SetWindow 11, 6, 19, 8
Menu $70, $0F, $70, [ ~E~dit / ~R~un / ~Q~uit ]
if ErrorLevel 3 GoTo Quit
if ErrorLevel 2 GoTo Run
...

Input and other commands / functions:

CommandDescription
ASK ["prompt"], keylistSet the errorlevel to the position in the list
ASKYN ["prompt"]Yes: errorlevel = 1, No errorlevel = 0
GETKEYSet the errorlevel to the ASCII value of a keystroke
GETKBFLAGSSet the errorlevel to the keyboard flags byte
SETKBFLAGS Change the keyboard flags
SETBIT n Set bit n of to 1
RESETBIT n Set bit n of to 0
GETBIT n Set the errorlevel to the value of bit n of (see keyboard flag bits table below)
INPUT Input any environment variable (from the keyboard)
IF KEYPRESSED ...If the user has pressed any key on the keyboard then ...
GETX Store the cursor position in a variable
GETY Store the cursor line in a variable
GETCURSOR Store the cursor size in a variable
SETCURSOR Set the size of the cursor (default $0B0C, block cursor: $001F, no cursor: $1F00)
DISKFREE Get the free space on a disk into a variable
UPPERCASE Change all letters in a variable to capitals
LOWERCASE Change the capitals into lowercase letters
GETDRIVE Set an environment variable to the current drive
GETDIR Set a variable to the current directory
GETDAY Set a variable to the day of the week
GETDATE Set a variable to the current date
GETTIME Set a variable to the current time
GETLENGTH Set the errorlevel to the length of the var
CHECKERRORS ONoff
BEEPMake a short sound.
GETRANDOMSet the errorlevel to a random number (0..255)
WRITECHAR n1 [,n2]Write 1 (or n2) character(s) with ASCII code n1
INLINE n1, n2, ...Use machine language in your programs (Hex numbers only), for example "INLINE cd 05" will print the screen. An INLINE procedure may destroy the values of the registers AX, BX, CX, DX, SI, DI and BP. The other registers must be restored.
 Keyboard flag bits:
76543210
.......1 Right Shift key pressed
......1. Left Shift key pressed
.....1.. Ctrl key pressed
....1... Alt key pressed
...1.... ScrollLock on
..1..... NumLock on
.1...... CapsLock on
1....... Insert mode on

Example for CheckErrors:

 CheckErrors OFF
ChDir %1
if ErrorLevel 1 Echo THERE IS NO DIRECTORY NAMED "%1".

There are two ways to run an external program:

  • Type only the name. A copy of COMMAND.COM is loaded and searches all directories of the PATH for the program. If the program is not found, you will get the message "Bad command or filename".
  • Type the full pathname and extension ("C:\UTIL\BC.EXE"). Use this method if you want to know what errorlevel is left by the program.

EXAMPLES

To learn more about BATCHCOM, take a look at the examples in the EXAMPLES folder. BATCHCOM programs usually have the extension .BC, because they can't be run as normal .BAT files.

TINY

The program TINY compresses .COM programs to make them even smaller.

About

Compiler for DOS batch files written in 1992 (creates .COM programs from .BAT or .BC files)

Topics

Resources

Stars

7 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - Wiering/BatchCom: Compiler for DOS batch files written in 1992 (creates .COM programs from .BAT or .BC files) · GitHub
Skip to content

Repository files navigation

BATCHCOM

BATCHCOM is a Batch Compiler. It compiles DOS batch files (.BAT) into executable DOS programs (.COM). In addition to the normal DOS commands, BATCHCOM supports many extra commands for program flow, variables and screen handling. BATCHCOM was designed to work with DOS 3.30, so some newer command options (found in DOS 5 or 6 and Windows NT, etc.) are not supported. However, with the extra commands, BATCHCOM is like a complete programming language.

Written in Turbo Pascal in 1992. To run this program now, use DosBox-X or VirtualBox.

Usage

BATCHCOM [filename[.bat]] [options]

Options:

 /M - include error messages
/S - use fast CRT screen procedures
/O - overwrite existing files without asking
/E n - environment size (default: 8192 bytes)
/L - list all commands

Supported DOS commands

CommandDescription
BREAK [on/off]Turn BREAK on or off
CALL ...Run a batch file and return to your program
CD/CHDIR ...Change directory
CLSClear the screen or the current window
COMMAND [/c ...]Run COMMAND.COM
COPY ...Copy file(s) (COPY is handled by COMMAND.COM)
DEL/ERASE ...Delete file(s)
DIR [/p][/w]Show a list of files in a directory
ECHO ...Write text to the screen
EXITExit program and return to DOS
FOR %%C in (list) do ...Set the variable %%C to all items of list and perform a command
GOTO labelGo to another line in the batch file (a label is any word after a colon ":")
IF [NOT] EXIST ...If the file exists, then ...
IF ERRORLEVEL x ...If the ERRORLEVEL is x or below x, then ...
IF ... == ...If the two strings are equal, then ...
MD/MKDIR ...Create a new directory
PATH ...Set or show the PATH
PAUSE [...]Wait for a keystroke
PROMPT ...Change the DOS prompt
REM ...Remark
RD/RMDIR ...Remove a directory
REN/RENAME ...Rename a file or a group of files
SET [var=[value]]Set an environment variable (Note: All variables are restored after running the program)
SHIFTMove all parameters (%1, %2, ..) one place back
TYPE ...Show the contents of a file
VERShow the current DOS version
VERIFY [onoff]
VOL ...Show the volume of a drive

Special characters in strings

Available for the commands ECHO, PAUSE, IF and SET:

 $g ">" $q "=" $s <Space>
$l "<" $h <BackSpace> $e <Esc>
$b "|" $_ <CR/LF> $$ "$"
$(n) ASCII number
$ at the end of a line: No <CR>

Variables

Besides the environment variables you may also define up to 100 32-bit variables to work with numbers. You can set these variables to integer numbers in the range -2147483648...+2147483647.

Variable commands

SyntaxDescription
VAR varname [=number]Define a new variable (if no number is specified the variable is set to 0)
LET var = numberSet the variable to a new value
LET var1 = var2Copy the value of var2 into var1
LET var = %1If %1 is not a valid number, the ERRORLEVEL is set to the position of the error
LET var = ERRORLEVELSets var to the current errorlevel
ADD var, xAdd the value of x to var
SUB var, xSubtract the value of x from var
NEG varChange the sign of var (+/-)
ABS varIf var < 0 then the sign is changed
MUL var, xMultiply var with x
DIV var, xInteger division

Writing variable numbers

 ECHO ... %VAR% ... Show the number of VAR (decimal)
ECHO %VAR:10% Use 10 spaces for the number (like this: " 123")
ECHO %VAR:-10% Spaces after the number ("123 ")
ECHO %VAR:010% Use "0" instead of spaces ("0000000123")
ECHO %VAR:b% Show the binary value ("1111011")
ECHO %VAR:X% Show the hexadecimal value ("7B")
ECHO %VAR:x% The same, but use lowercase letters ("7b")
ECHO %VAR:o% Show the octal value (173)

Comparing variables

 IF %var1% = %var2% ... If the two variables are the same then ...
IF %var1% <> %var2% .. If the variables are different then ...
IF %var1% > %var2% ... If var1 is larger than var2 then ...
IF %var1% < %var2% ... If var1 is smaller than var2 then ...
IF %var1% >= %var2% .. If var1 is larger than or equal to var2 then ...
IF %var1% <= %var2% .. If var1 is smaller than or equal to var2 then ...
  • You may always insert the word NOT to reverse the condition
  • If you compare strings with <, >, <= or >=, first the length is compared

GOSUB and RETURN

You can create subroutines in your programs by using these commands. Example:

 GoTo Start
:Proc1
...
Return
:Start
...
GoSub Proc1
...
GoSub Proc1

You can run the same procedure as often as you like without having to write it again.

  • NOTE: Never go to a subroutine using the GOTO command.
  • RETURN without GOSUB could cause the system to crach.

Other commands

CommandDescription
CRTAfter this command all the output to screen is written directly to the video buffer
DOSUse DOS routines to handle output to screen
SETCOLOR nChange the attribute. Only if CRT procedures are installed (valid attributes are 0..255 or $00..$FF)
MOVETO x, yChange the position of the cursor
SETWINDOW x1, y1, x2, y2Define a window (Use this command before CLS, FILLWINDOW, FRAMEWIN, MENU, SCROLL). Default: 1, 1, 80, 25
SCROLL nScroll the current window n lines up (or down: n < 0)
FRAMEWINDOW chars, titleDraw a frame in the current window. Chars is either DOUBLEFRAME or SINGLEFRAME or the characters to be used in the frame, eg. ╔═╗║║╚═╝. Title is any text
FILLWINDOW nFills the window with one character (n = 0..255)
CHECKANSISet the errorlevel to 1 if ANSI.SYS is installed
GETSCREENSave the contents of the entire screen in memory
PUTSCREENRestores the last screen saved by GETSCREEN or LOADSCREEN
SAVESCREEN fileSave a screen to the disk
LOADSCREEN fileLoad a screen from the disk into memory (use PUTSCREEN to display it)
COUNTPARAMSSet the errorlevel to the number of parameters

Menus

MENU [c1,] [c2,] [c3,] "[" ~O~ption1 "/" O~p~tion2 [/...] "]" [";"]
c1 Attribute of highlighted bar
c2 Attribute of hot keys
c3 Attribute of hot key in highlighted bar
~X~ Hot key
";" Return if the user presses <-- or --> (errorlevel 254, 255)

If the user presses a hot key or , the errorlevel will be set to the number of the option. If is pressed the errorlevel is set to 0. Example:

Cls
SetWindow 10, 5, 20, 9
FrameWindow SingleFrame, Menu SetWindow 11, 6, 19, 8
Menu $70, $0F, $70, [ ~E~dit / ~R~un / ~Q~uit ]
if ErrorLevel 3 GoTo Quit
if ErrorLevel 2 GoTo Run
...

Input and other commands / functions:

CommandDescription
ASK ["prompt"], keylistSet the errorlevel to the position in the list
ASKYN ["prompt"]Yes: errorlevel = 1, No errorlevel = 0
GETKEYSet the errorlevel to the ASCII value of a keystroke
GETKBFLAGSSet the errorlevel to the keyboard flags byte
SETKBFLAGS Change the keyboard flags
SETBIT n Set bit n of to 1
RESETBIT n Set bit n of to 0
GETBIT n Set the errorlevel to the value of bit n of (see keyboard flag bits table below)
INPUT Input any environment variable (from the keyboard)
IF KEYPRESSED ...If the user has pressed any key on the keyboard then ...
GETX Store the cursor position in a variable
GETY Store the cursor line in a variable
GETCURSOR Store the cursor size in a variable
SETCURSOR Set the size of the cursor (default $0B0C, block cursor: $001F, no cursor: $1F00)
DISKFREE Get the free space on a disk into a variable
UPPERCASE Change all letters in a variable to capitals
LOWERCASE Change the capitals into lowercase letters
GETDRIVE Set an environment variable to the current drive
GETDIR Set a variable to the current directory
GETDAY Set a variable to the day of the week
GETDATE Set a variable to the current date
GETTIME Set a variable to the current time
GETLENGTH Set the errorlevel to the length of the var
CHECKERRORS ONoff
BEEPMake a short sound.
GETRANDOMSet the errorlevel to a random number (0..255)
WRITECHAR n1 [,n2]Write 1 (or n2) character(s) with ASCII code n1
INLINE n1, n2, ...Use machine language in your programs (Hex numbers only), for example "INLINE cd 05" will print the screen. An INLINE procedure may destroy the values of the registers AX, BX, CX, DX, SI, DI and BP. The other registers must be restored.
 Keyboard flag bits:
76543210
.......1 Right Shift key pressed
......1. Left Shift key pressed
.....1.. Ctrl key pressed
....1... Alt key pressed
...1.... ScrollLock on
..1..... NumLock on
.1...... CapsLock on
1....... Insert mode on

Example for CheckErrors:

 CheckErrors OFF
ChDir %1
if ErrorLevel 1 Echo THERE IS NO DIRECTORY NAMED "%1".

There are two ways to run an external program:

  • Type only the name. A copy of COMMAND.COM is loaded and searches all directories of the PATH for the program. If the program is not found, you will get the message "Bad command or filename".
  • Type the full pathname and extension ("C:\UTIL\BC.EXE"). Use this method if you want to know what errorlevel is left by the program.

EXAMPLES

To learn more about BATCHCOM, take a look at the examples in the EXAMPLES folder. BATCHCOM programs usually have the extension .BC, because they can't be run as normal .BAT files.

TINY

The program TINY compresses .COM programs to make them even smaller.

About

Compiler for DOS batch files written in 1992 (creates .COM programs from .BAT or .BC files)

Topics

Resources

Stars

7 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - Wiering/BatchCom: Compiler for DOS batch files written in 1992 (creates .COM programs from .BAT or .BC files) · GitHub
Skip to content

Repository files navigation

BATCHCOM

BATCHCOM is a Batch Compiler. It compiles DOS batch files (.BAT) into executable DOS programs (.COM). In addition to the normal DOS commands, BATCHCOM supports many extra commands for program flow, variables and screen handling. BATCHCOM was designed to work with DOS 3.30, so some newer command options (found in DOS 5 or 6 and Windows NT, etc.) are not supported. However, with the extra commands, BATCHCOM is like a complete programming language.

Written in Turbo Pascal in 1992. To run this program now, use DosBox-X or VirtualBox.

Usage

BATCHCOM [filename[.bat]] [options]

Options:

 /M - include error messages
/S - use fast CRT screen procedures
/O - overwrite existing files without asking
/E n - environment size (default: 8192 bytes)
/L - list all commands

Supported DOS commands

CommandDescription
BREAK [on/off]Turn BREAK on or off
CALL ...Run a batch file and return to your program
CD/CHDIR ...Change directory
CLSClear the screen or the current window
COMMAND [/c ...]Run COMMAND.COM
COPY ...Copy file(s) (COPY is handled by COMMAND.COM)
DEL/ERASE ...Delete file(s)
DIR [/p][/w]Show a list of files in a directory
ECHO ...Write text to the screen
EXITExit program and return to DOS
FOR %%C in (list) do ...Set the variable %%C to all items of list and perform a command
GOTO labelGo to another line in the batch file (a label is any word after a colon ":")
IF [NOT] EXIST ...If the file exists, then ...
IF ERRORLEVEL x ...If the ERRORLEVEL is x or below x, then ...
IF ... == ...If the two strings are equal, then ...
MD/MKDIR ...Create a new directory
PATH ...Set or show the PATH
PAUSE [...]Wait for a keystroke
PROMPT ...Change the DOS prompt
REM ...Remark
RD/RMDIR ...Remove a directory
REN/RENAME ...Rename a file or a group of files
SET [var=[value]]Set an environment variable (Note: All variables are restored after running the program)
SHIFTMove all parameters (%1, %2, ..) one place back
TYPE ...Show the contents of a file
VERShow the current DOS version
VERIFY [onoff]
VOL ...Show the volume of a drive

Special characters in strings

Available for the commands ECHO, PAUSE, IF and SET:

 $g ">" $q "=" $s <Space>
$l "<" $h <BackSpace> $e <Esc>
$b "|" $_ <CR/LF> $$ "$"
$(n) ASCII number
$ at the end of a line: No <CR>

Variables

Besides the environment variables you may also define up to 100 32-bit variables to work with numbers. You can set these variables to integer numbers in the range -2147483648...+2147483647.

Variable commands

SyntaxDescription
VAR varname [=number]Define a new variable (if no number is specified the variable is set to 0)
LET var = numberSet the variable to a new value
LET var1 = var2Copy the value of var2 into var1
LET var = %1If %1 is not a valid number, the ERRORLEVEL is set to the position of the error
LET var = ERRORLEVELSets var to the current errorlevel
ADD var, xAdd the value of x to var
SUB var, xSubtract the value of x from var
NEG varChange the sign of var (+/-)
ABS varIf var < 0 then the sign is changed
MUL var, xMultiply var with x
DIV var, xInteger division

Writing variable numbers

 ECHO ... %VAR% ... Show the number of VAR (decimal)
ECHO %VAR:10% Use 10 spaces for the number (like this: " 123")
ECHO %VAR:-10% Spaces after the number ("123 ")
ECHO %VAR:010% Use "0" instead of spaces ("0000000123")
ECHO %VAR:b% Show the binary value ("1111011")
ECHO %VAR:X% Show the hexadecimal value ("7B")
ECHO %VAR:x% The same, but use lowercase letters ("7b")
ECHO %VAR:o% Show the octal value (173)

Comparing variables

 IF %var1% = %var2% ... If the two variables are the same then ...
IF %var1% <> %var2% .. If the variables are different then ...
IF %var1% > %var2% ... If var1 is larger than var2 then ...
IF %var1% < %var2% ... If var1 is smaller than var2 then ...
IF %var1% >= %var2% .. If var1 is larger than or equal to var2 then ...
IF %var1% <= %var2% .. If var1 is smaller than or equal to var2 then ...
  • You may always insert the word NOT to reverse the condition
  • If you compare strings with <, >, <= or >=, first the length is compared

GOSUB and RETURN

You can create subroutines in your programs by using these commands. Example:

 GoTo Start
:Proc1
...
Return
:Start
...
GoSub Proc1
...
GoSub Proc1

You can run the same procedure as often as you like without having to write it again.

  • NOTE: Never go to a subroutine using the GOTO command.
  • RETURN without GOSUB could cause the system to crach.

Other commands

CommandDescription
CRTAfter this command all the output to screen is written directly to the video buffer
DOSUse DOS routines to handle output to screen
SETCOLOR nChange the attribute. Only if CRT procedures are installed (valid attributes are 0..255 or $00..$FF)
MOVETO x, yChange the position of the cursor
SETWINDOW x1, y1, x2, y2Define a window (Use this command before CLS, FILLWINDOW, FRAMEWIN, MENU, SCROLL). Default: 1, 1, 80, 25
SCROLL nScroll the current window n lines up (or down: n < 0)
FRAMEWINDOW chars, titleDraw a frame in the current window. Chars is either DOUBLEFRAME or SINGLEFRAME or the characters to be used in the frame, eg. ╔═╗║║╚═╝. Title is any text
FILLWINDOW nFills the window with one character (n = 0..255)
CHECKANSISet the errorlevel to 1 if ANSI.SYS is installed
GETSCREENSave the contents of the entire screen in memory
PUTSCREENRestores the last screen saved by GETSCREEN or LOADSCREEN
SAVESCREEN fileSave a screen to the disk
LOADSCREEN fileLoad a screen from the disk into memory (use PUTSCREEN to display it)
COUNTPARAMSSet the errorlevel to the number of parameters

Menus

MENU [c1,] [c2,] [c3,] "[" ~O~ption1 "/" O~p~tion2 [/...] "]" [";"]
c1 Attribute of highlighted bar
c2 Attribute of hot keys
c3 Attribute of hot key in highlighted bar
~X~ Hot key
";" Return if the user presses <-- or --> (errorlevel 254, 255)

If the user presses a hot key or , the errorlevel will be set to the number of the option. If is pressed the errorlevel is set to 0. Example:

Cls
SetWindow 10, 5, 20, 9
FrameWindow SingleFrame, Menu SetWindow 11, 6, 19, 8
Menu $70, $0F, $70, [ ~E~dit / ~R~un / ~Q~uit ]
if ErrorLevel 3 GoTo Quit
if ErrorLevel 2 GoTo Run
...

Input and other commands / functions:

CommandDescription
ASK ["prompt"], keylistSet the errorlevel to the position in the list
ASKYN ["prompt"]Yes: errorlevel = 1, No errorlevel = 0
GETKEYSet the errorlevel to the ASCII value of a keystroke
GETKBFLAGSSet the errorlevel to the keyboard flags byte
SETKBFLAGS Change the keyboard flags
SETBIT n Set bit n of to 1
RESETBIT n Set bit n of to 0
GETBIT n Set the errorlevel to the value of bit n of (see keyboard flag bits table below)
INPUT Input any environment variable (from the keyboard)
IF KEYPRESSED ...If the user has pressed any key on the keyboard then ...
GETX Store the cursor position in a variable
GETY Store the cursor line in a variable
GETCURSOR Store the cursor size in a variable
SETCURSOR Set the size of the cursor (default $0B0C, block cursor: $001F, no cursor: $1F00)
DISKFREE Get the free space on a disk into a variable
UPPERCASE Change all letters in a variable to capitals
LOWERCASE Change the capitals into lowercase letters
GETDRIVE Set an environment variable to the current drive
GETDIR Set a variable to the current directory
GETDAY Set a variable to the day of the week
GETDATE Set a variable to the current date
GETTIME Set a variable to the current time
GETLENGTH Set the errorlevel to the length of the var
CHECKERRORS ONoff
BEEPMake a short sound.
GETRANDOMSet the errorlevel to a random number (0..255)
WRITECHAR n1 [,n2]Write 1 (or n2) character(s) with ASCII code n1
INLINE n1, n2, ...Use machine language in your programs (Hex numbers only), for example "INLINE cd 05" will print the screen. An INLINE procedure may destroy the values of the registers AX, BX, CX, DX, SI, DI and BP. The other registers must be restored.
 Keyboard flag bits:
76543210
.......1 Right Shift key pressed
......1. Left Shift key pressed
.....1.. Ctrl key pressed
....1... Alt key pressed
...1.... ScrollLock on
..1..... NumLock on
.1...... CapsLock on
1....... Insert mode on

Example for CheckErrors:

 CheckErrors OFF
ChDir %1
if ErrorLevel 1 Echo THERE IS NO DIRECTORY NAMED "%1".

There are two ways to run an external program:

  • Type only the name. A copy of COMMAND.COM is loaded and searches all directories of the PATH for the program. If the program is not found, you will get the message "Bad command or filename".
  • Type the full pathname and extension ("C:\UTIL\BC.EXE"). Use this method if you want to know what errorlevel is left by the program.

EXAMPLES

To learn more about BATCHCOM, take a look at the examples in the EXAMPLES folder. BATCHCOM programs usually have the extension .BC, because they can't be run as normal .BAT files.

TINY

The program TINY compresses .COM programs to make them even smaller.

About

Compiler for DOS batch files written in 1992 (creates .COM programs from .BAT or .BC files)

Topics

Resources

Stars

7 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Universal Dark Mode - works on any site (function() { var enabled = true; function applyDarkMode() { if (!enabled) return; // Create style element if it doesn't exist var style = document.getElementById('universal-dark-mode-style'); if (!style) { style = document.createElement('style'); style.id = 'universal-dark-mode-style'; document.head.appendChild(style); } // Dark mode CSS - inverts colors but preserves images/video style.textContent = ' /* Invert everything except media */ html { filter: invert(1) hue-rotate(180deg) !important; background: #1a1a2e !important; } /* Restore images, videos, iframes, canvas */ img, video, iframe, canvas, svg, picture, [style*="background-image"] { filter: invert(1) hue-rotate(180deg) !important; } /* Preserve specific elements that should not be inverted */ .no-dark-mode, .no-dark-mode *, [data-theme="light"], [data-theme="light"], .ace_editor, .ace_editor *, .CodeMirror, .CodeMirror *, .monaco-editor, .monaco-editor *, .markdown-body pre, .markdown-body pre *, .highlight, .highlight *, pre code, pre code * { filter: none !important; } /* Fix common UI elements */ .modal, .popup, .dropdown-menu, .tooltip, .popover { filter: invert(1) hue-rotate(180deg) !important; background: #2d2d44 !important; border-color: #444 !important; } /* Scrollbars */ ::-webkit-scrollbar { background: #1a1a2e !important; } ::-webkit-scrollbar-thumb { background: #444 !important; } ::-webkit-scrollbar-thumb:hover { background: #555 !important; } /* Selection */ ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; } ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; } '; } function removeDarkMode() { var style = document.getElementById('universal-dark-mode-style'); if (style) style.remove(); } // Toggle with Alt+Shift+D document.addEventListener('keydown', function(e) { if (e.altKey && e.shiftKey && e.key === 'D') { e.preventDefault(); enabled = !enabled; if (enabled) { applyDarkMode(); console.log('[Universal Dark Mode] Enabled'); } else { removeDarkMode(); console.log('[Universal Dark Mode] Disabled'); } } }); // Apply on load applyDarkMode(); // Re-apply on dynamic content var observer = new MutationObserver(function(mutations) { if (enabled && !document.getElementById('universal-dark-mode-style')) { applyDarkMode(); } }); observer.observe(document.head, { childList: true }); console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle'); })(); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })(); GitHub - Wiering/BatchCom: Compiler for DOS batch files written in 1992 (creates .COM programs from .BAT or .BC files) · GitHub
Skip to content

Repository files navigation

BATCHCOM

BATCHCOM is a Batch Compiler. It compiles DOS batch files (.BAT) into executable DOS programs (.COM). In addition to the normal DOS commands, BATCHCOM supports many extra commands for program flow, variables and screen handling. BATCHCOM was designed to work with DOS 3.30, so some newer command options (found in DOS 5 or 6 and Windows NT, etc.) are not supported. However, with the extra commands, BATCHCOM is like a complete programming language.

Written in Turbo Pascal in 1992. To run this program now, use DosBox-X or VirtualBox.

Usage

BATCHCOM [filename[.bat]] [options]

Options:

 /M - include error messages
/S - use fast CRT screen procedures
/O - overwrite existing files without asking
/E n - environment size (default: 8192 bytes)
/L - list all commands

Supported DOS commands

CommandDescription
BREAK [on/off]Turn BREAK on or off
CALL ...Run a batch file and return to your program
CD/CHDIR ...Change directory
CLSClear the screen or the current window
COMMAND [/c ...]Run COMMAND.COM
COPY ...Copy file(s) (COPY is handled by COMMAND.COM)
DEL/ERASE ...Delete file(s)
DIR [/p][/w]Show a list of files in a directory
ECHO ...Write text to the screen
EXITExit program and return to DOS
FOR %%C in (list) do ...Set the variable %%C to all items of list and perform a command
GOTO labelGo to another line in the batch file (a label is any word after a colon ":")
IF [NOT] EXIST ...If the file exists, then ...
IF ERRORLEVEL x ...If the ERRORLEVEL is x or below x, then ...
IF ... == ...If the two strings are equal, then ...
MD/MKDIR ...Create a new directory
PATH ...Set or show the PATH
PAUSE [...]Wait for a keystroke
PROMPT ...Change the DOS prompt
REM ...Remark
RD/RMDIR ...Remove a directory
REN/RENAME ...Rename a file or a group of files
SET [var=[value]]Set an environment variable (Note: All variables are restored after running the program)
SHIFTMove all parameters (%1, %2, ..) one place back
TYPE ...Show the contents of a file
VERShow the current DOS version
VERIFY [onoff]
VOL ...Show the volume of a drive

Special characters in strings

Available for the commands ECHO, PAUSE, IF and SET:

 $g ">" $q "=" $s <Space>
$l "<" $h <BackSpace> $e <Esc>
$b "|" $_ <CR/LF> $$ "$"
$(n) ASCII number
$ at the end of a line: No <CR>

Variables

Besides the environment variables you may also define up to 100 32-bit variables to work with numbers. You can set these variables to integer numbers in the range -2147483648...+2147483647.

Variable commands

SyntaxDescription
VAR varname [=number]Define a new variable (if no number is specified the variable is set to 0)
LET var = numberSet the variable to a new value
LET var1 = var2Copy the value of var2 into var1
LET var = %1If %1 is not a valid number, the ERRORLEVEL is set to the position of the error
LET var = ERRORLEVELSets var to the current errorlevel
ADD var, xAdd the value of x to var
SUB var, xSubtract the value of x from var
NEG varChange the sign of var (+/-)
ABS varIf var < 0 then the sign is changed
MUL var, xMultiply var with x
DIV var, xInteger division

Writing variable numbers

 ECHO ... %VAR% ... Show the number of VAR (decimal)
ECHO %VAR:10% Use 10 spaces for the number (like this: " 123")
ECHO %VAR:-10% Spaces after the number ("123 ")
ECHO %VAR:010% Use "0" instead of spaces ("0000000123")
ECHO %VAR:b% Show the binary value ("1111011")
ECHO %VAR:X% Show the hexadecimal value ("7B")
ECHO %VAR:x% The same, but use lowercase letters ("7b")
ECHO %VAR:o% Show the octal value (173)

Comparing variables

 IF %var1% = %var2% ... If the two variables are the same then ...
IF %var1% <> %var2% .. If the variables are different then ...
IF %var1% > %var2% ... If var1 is larger than var2 then ...
IF %var1% < %var2% ... If var1 is smaller than var2 then ...
IF %var1% >= %var2% .. If var1 is larger than or equal to var2 then ...
IF %var1% <= %var2% .. If var1 is smaller than or equal to var2 then ...
  • You may always insert the word NOT to reverse the condition
  • If you compare strings with <, >, <= or >=, first the length is compared

GOSUB and RETURN

You can create subroutines in your programs by using these commands. Example:

 GoTo Start
:Proc1
...
Return
:Start
...
GoSub Proc1
...
GoSub Proc1

You can run the same procedure as often as you like without having to write it again.

  • NOTE: Never go to a subroutine using the GOTO command.
  • RETURN without GOSUB could cause the system to crach.

Other commands

CommandDescription
CRTAfter this command all the output to screen is written directly to the video buffer
DOSUse DOS routines to handle output to screen
SETCOLOR nChange the attribute. Only if CRT procedures are installed (valid attributes are 0..255 or $00..$FF)
MOVETO x, yChange the position of the cursor
SETWINDOW x1, y1, x2, y2Define a window (Use this command before CLS, FILLWINDOW, FRAMEWIN, MENU, SCROLL). Default: 1, 1, 80, 25
SCROLL nScroll the current window n lines up (or down: n < 0)
FRAMEWINDOW chars, titleDraw a frame in the current window. Chars is either DOUBLEFRAME or SINGLEFRAME or the characters to be used in the frame, eg. ╔═╗║║╚═╝. Title is any text
FILLWINDOW nFills the window with one character (n = 0..255)
CHECKANSISet the errorlevel to 1 if ANSI.SYS is installed
GETSCREENSave the contents of the entire screen in memory
PUTSCREENRestores the last screen saved by GETSCREEN or LOADSCREEN
SAVESCREEN fileSave a screen to the disk
LOADSCREEN fileLoad a screen from the disk into memory (use PUTSCREEN to display it)
COUNTPARAMSSet the errorlevel to the number of parameters

Menus

MENU [c1,] [c2,] [c3,] "[" ~O~ption1 "/" O~p~tion2 [/...] "]" [";"]
c1 Attribute of highlighted bar
c2 Attribute of hot keys
c3 Attribute of hot key in highlighted bar
~X~ Hot key
";" Return if the user presses <-- or --> (errorlevel 254, 255)

If the user presses a hot key or , the errorlevel will be set to the number of the option. If is pressed the errorlevel is set to 0. Example:

Cls
SetWindow 10, 5, 20, 9
FrameWindow SingleFrame, Menu SetWindow 11, 6, 19, 8
Menu $70, $0F, $70, [ ~E~dit / ~R~un / ~Q~uit ]
if ErrorLevel 3 GoTo Quit
if ErrorLevel 2 GoTo Run
...

Input and other commands / functions:

CommandDescription
ASK ["prompt"], keylistSet the errorlevel to the position in the list
ASKYN ["prompt"]Yes: errorlevel = 1, No errorlevel = 0
GETKEYSet the errorlevel to the ASCII value of a keystroke
GETKBFLAGSSet the errorlevel to the keyboard flags byte
SETKBFLAGS Change the keyboard flags
SETBIT n Set bit n of to 1
RESETBIT n Set bit n of to 0
GETBIT n Set the errorlevel to the value of bit n of (see keyboard flag bits table below)
INPUT Input any environment variable (from the keyboard)
IF KEYPRESSED ...If the user has pressed any key on the keyboard then ...
GETX Store the cursor position in a variable
GETY Store the cursor line in a variable
GETCURSOR Store the cursor size in a variable
SETCURSOR Set the size of the cursor (default $0B0C, block cursor: $001F, no cursor: $1F00)
DISKFREE Get the free space on a disk into a variable
UPPERCASE Change all letters in a variable to capitals
LOWERCASE Change the capitals into lowercase letters
GETDRIVE Set an environment variable to the current drive
GETDIR Set a variable to the current directory
GETDAY Set a variable to the day of the week
GETDATE Set a variable to the current date
GETTIME Set a variable to the current time
GETLENGTH Set the errorlevel to the length of the var
CHECKERRORS ONoff
BEEPMake a short sound.
GETRANDOMSet the errorlevel to a random number (0..255)
WRITECHAR n1 [,n2]Write 1 (or n2) character(s) with ASCII code n1
INLINE n1, n2, ...Use machine language in your programs (Hex numbers only), for example "INLINE cd 05" will print the screen. An INLINE procedure may destroy the values of the registers AX, BX, CX, DX, SI, DI and BP. The other registers must be restored.
 Keyboard flag bits:
76543210
.......1 Right Shift key pressed
......1. Left Shift key pressed
.....1.. Ctrl key pressed
....1... Alt key pressed
...1.... ScrollLock on
..1..... NumLock on
.1...... CapsLock on
1....... Insert mode on

Example for CheckErrors:

 CheckErrors OFF
ChDir %1
if ErrorLevel 1 Echo THERE IS NO DIRECTORY NAMED "%1".

There are two ways to run an external program:

  • Type only the name. A copy of COMMAND.COM is loaded and searches all directories of the PATH for the program. If the program is not found, you will get the message "Bad command or filename".
  • Type the full pathname and extension ("C:\UTIL\BC.EXE"). Use this method if you want to know what errorlevel is left by the program.

EXAMPLES

To learn more about BATCHCOM, take a look at the examples in the EXAMPLES folder. BATCHCOM programs usually have the extension .BC, because they can't be run as normal .BAT files.

TINY

The program TINY compresses .COM programs to make them even smaller.

About

Compiler for DOS batch files written in 1992 (creates .COM programs from .BAT or .BC files)

Topics

Resources

Stars

7 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages