Я нашел решение, я сделал это:
$query->addSelect('CASE WHEN c.priority IS NULL THEN 1 ELSE 0 END as HIDDEN priority_is_null');
$query->addSelect('CASE WHEN c.priority = 0 THEN 1 ELSE 0 END as HIDDEN priority_is_zero');
$query->addOrderBy('priority_is_null', 'ASC');
$query->addOrderBy('priority_is_zero', 'ASC');
$query->addOrderBy('c.priority', 'ASC');
p / invoke GetFileType (GetStdHandle (STD_OUTPUT_HANDLE))
или вызов безобидной консольной функции, например GetConsoleScreenBufferInfo
для проверки на недопустимую ошибку дескриптора. Если вы хотите узнать о стандартной ошибке, используйте STD_ERROR_HANDLE
. Я полагаю, что вы даже можете сравнить дескрипторы, возвращенные GetStdHandle (STD_OUTPUT_HANDLE)
и GetStdHandle (STD_ERROR_HANDLE)
, чтобы обнаружить такие вещи, как 2> & 1
Хотя это немного затуманено и, вероятно, не гарантированно сработает, вы можете попробовать это:
bool isRedirected;
try
{
isRedirected = Console.CursorVisible && false;
}
catch
{
isRedirected = true;
}
Вызов CursorVisible вызывает исключение, когда консоль перенаправлена.
You need to use reflection - a bit grubby but the following will work:
static bool IsConsoleRedirected()
{
var writer = Console.Out;
if (writer == null || writer.GetType ().FullName != "System.IO.TextWriter+SyncTextWriter") return true;
var fld = writer.GetType ().GetField ("_out", BindingFlags.Instance | BindingFlags.NonPublic);
if (fld == null) return true;
var streamWriter = fld.GetValue (writer) as StreamWriter;
if (streamWriter == null) return true;
return streamWriter.BaseStream.GetType ().FullName != "System.IO.__ConsoleStream";
}
Почему выходной файл переносится в перенаправленном файле? Обтекание, которое делает консоль, не посредством разрывов строк. Другими словами, эта строка:
привет, меня зовут Эндрю Хэйр
, обернул бы в тощую консоль вот так:
привет, мой нам
это Андрей
Хэйр
, но если бы ты перенаправил вывод в файл, это было бы написано так:
привет, меня зовут Эндрю Хэйр
, поскольку в выводе нет настоящих разрывов строк.
Не делай этого! Просто передайте дополнительный параметр командной строки, который определяет форматирование, которое вы хотите применить. Это проще, чище и легче понять как людям, которые будут использовать ваше приложение, так и людям, которые будут работать над вашим кодом.