Enhance Batch File Functionality With C# Application : Part I


Description

Batch (.bat or .cmd) file has its rich set of commands and processing directives. It can execute any DOS commands as well as executable files. After the execution, batch file can examine the error code (also called exit code) and act accordingly. This article shows you two different ways to emit exit code from C# application and a batch file that uses the information. This practical approach can be used to provide enhanced functionality for existing batch files.

For demo purpose, the batch file would Echo different greetings to its users based on the hour of the day. It displays Good Morning until 12:00pm, then Good Afternoon until 6:00pm, and Good Evening thereafter. Even if it is doable within batch file itself, we decide to spend a few minutes writing up a console-based C# application that set different exit code based on hour of the day.

The Main method in startup class (or struct) can be of the type void or return an int. The latter form allows you to return the exit code.

Source Code (CheckTime1.cs):

using System;
namespace CheckTime
{
class Class1
{
static int Main(string[] args)
{
int greetingId;
int hourNow = System.DateTime.Now.Hour;
if (hourNow < 12)
greetingId = 0;
else if (hourNow < 18)
greetingId = 1;
else
greetingId = 2;
return greetingId;
}
}
}

This program returns 0, 1 or 2 based on the criteria abovementioned. The batch file can examine the returned value via errorlevel value.

Source Code (Demo1.bat):

@Echo Off
@Echo [Demo1]
@Echo
checkTime1.exe
goto Greeting%errorlevel%
:Greeting0
echo Good Morning
goto end
:Greeting1
echo Good Afternoon
goto end
:Greeting2
echo Good Evening
goto end
:end

Another way to emit exit code from C# is to use System.Environment.ExitCode property. It is more flexible as we can set exit code from any methods. The code below used this property.

Source Code (CheckTime2.cs):

using System;
namespace CheckTime
{
class Class1
{
static void anotherMethod()
{
int greetingId;
int hourNow = System.DateTime.Now.Hour;
if (hourNow < 12)
greetingId = 0;
else if (hourNow < 18)
greetingId = 1;
else
greetingId = 2;
System.Environment.ExitCode = greetingId;
}
static void Main(string[] args)
{
anotherMethod();
}
}
}

What if we use both methods in one application? As with the general rules for property, it is the last assignment that counts, So whatever value returned from Main method is the exit code for the application.

In Part 2, we discuss adding a GUI option page when a batch file is called without all necessary arguments.