У меня есть следующий код для записи в командную консоль Windows:
use Win32::Console;
my $console = new Win32::Console(Win32::Console::STD_ERROR_HANDLE());
my $defaultAttribute = $console->Attr();
my $defaultFG = ($defaultAttribute & 0x0F);
my $defaultBG = ($defaultAttribute & 0xF0);
$console->Attr($defaultBG | $Win32::Console::FG_LIGHTGREEN);
$console->Write("blah blah");
$console->Attr($defaultAttribute);
Этот код дает сбой, если пользователь перенаправляет STDERR при вызове моего скрипта:
perl myscript.pl 2> foo
Как я могу получить дескриптор консоли Win32, к которой привязан процесс, без ссылки на один из стандартных дескрипторов, чтобы не имело значения, какие перенаправления делает пользователь?
Эффект, который я хочу, состоит в том, чтобы иметь возможность написать сообщение на консоли сразу после нормального вывода программы, независимо от любого перенаправления, аналогично встроенной команде bash time
. По сути, аналогично открытию и записи в /dev/tty
в Unix.
Я пробовал my $console = new Win32::Console()
выделить новую консоль, за которой следует $console->Display()
, но это совершенно неправильно.
time
в bash, и я хочу использовать ее как:cd this && mytime mvn ... >> ..\x 2>&1 && cd ..\that && mytime mvn ... >> ..\x 2>&1
с выводом компиляции в x и таймингами на экране. Кроме того, он заполняет то, что мне показалось пробелом между тем, что позволяет Win32::Console, и тем, что возможно с Windows API. - person Adrian Pronk   schedule 13.02.2013