Let’s assume you have a Batch file (test.bat) with the following contents:
@echo off
echo 1
cls
echo 2
And then you run this Batch file and redirect its output to a text file called “out.txt”:
C:>test.bat >out.txt
What do you think the output would be?
At first, I thought it would be:
1
2
But little did I know that when ‘cls’ is invoked in a context where stdout is redirect to a file, then a form feed character (0xC) is emitted instead:
I was curious, so I disassembled ‘cmd.exe’ to verify my findings. Lo and behold, indeed, ‘cmd.exe’ does that:
int __stdcall eCls(struct cmdnode *a1)
{
HANDLE hStdOut;
HANDLE v2;
SMALL_RECT ScrollRectangle;
COORD dwDestinationOrigin;
CHAR_INFO Fill;
struct _CONSOLE_SCREEN_BUFFER_INFO ConsoleScreenBufferInfo;
if ( FileIsDevice((char *)1) )
{
hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);
if ( GetConsoleScreenBufferInfo(hStdOut, &ConsoleScreenBufferInfo) )
{
dwDestinationOrigin.Y = -ConsoleScreenBufferInfo.dwSize.Y;
dwDestinationOrigin.X = 0;
*(_DWORD *)&ScrollRectangle.Left = 0;
ScrollRectangle.Bottom = ConsoleScreenBufferInfo.dwSize.Y;
ScrollRectangle.Right = ConsoleScreenBufferInfo.dwSize.X;
Fill.Char.UnicodeChar = 32;
Fill.Attributes = ConsoleScreenBufferInfo.wAttributes;
ScrollConsoleScreenBufferW(hStdOut, &ScrollRectangle, 0, dwDestinationOrigin, &Fill);
ConsoleScreenBufferInfo.dwCursorPosition = 0;
v2 = GetStdHandle(0xFFFFFFF5);
SetConsoleCursorPosition(v2, 0);
}
else
{
cmd_printf(page_feed);
}
}
else
{
cmd_printf(page_feed);
}
return 0;
}
(Lines 29 and 34 are of interest)
In conclusion, be aware if you redirect a Batch file to another file and compare the result. If the Batch file uses CLS, you have to account for the form feed character showing up!
Do you want to master Batch Files programming? Look no further, the Batchography is the best book on the topic and the most up to date!
Available in print or e-book editions from Amazon.
You might also like:
Like this:
Like Loading...