C#, как записать в STDERR сообщение об ошибке из консольного приложения.

Пост из серии спрашивали — отвечаем.

Итак, как в C# записать в STDERR. STDERR — это стандартный поток вывода для сообщений об ошибках, туда правильно организованные консольные приложения отправляют, собственно, сообщения об ошибках. Отправить в STDERR сообщение можно с помощью объекта Console.Error:

Console.Error.WriteLine("Write to STDERR.");

Код тестового приложения

static void Main(string[] args)
{
    Console.WriteLine("Write to STDOUT.");
    Console.Error.WriteLine("Write to STDERR.");
}

Проверка

Для проверки можно создать BAT-файл, вызывающий тестовое приложение и переопределяющий (копия) вывод со стандартных потоков в файлы stderr_.txt и stdout_.txt. stderr и stdout являются зарезервированными системными именами, потому к именам файлов надо что-то добавить, знак _ в данном случае:

Экран при выполнении тестового приложения:

Z:\...\write2stderr\write2stderr\bin\Debug>write2stderr.exe
Write to STDOUT.
Write to STDERR.

При выполнении BAT-файла экран останется пустым, но в директории с файлом появятся два файла stderr_.txt и stdout_.txt со следующим содержимым.

stderr_.txt:
	Write to STDERR.

stdout_.txt:
	Write to STDOUT.

Пример на GitHub

Исходник
Тестовый BAT-файл
BAT-файл и скомпилированный EXE

Мухоморовые недотрипы или (псевдо)научный эксперимент на себе.

Диклеймер

В этом тексте описываются опасные эксперименты. Пожалуйста, не повторяйте их дома. Автор и редакция отказываются от любой ответственности, если вы повторите опыты на себе.

Красный мухомор не содержит наркотических или иных запрещенных веществ, внесенных в списки таковых в Российской Федерации, США, Украине, Великобритании, Австралии или Европейском Союзе. Данный текст является любительским научным исследованием и не пропагандирует употребление запрещенных веществ. Красный мухомор относится к ядовитым, условно ядовитым или несъедобным грибам, в зависимости от классификации в различных научных исследованиях. Мы не рекомендуем его употребление. При самостоятельном сборе, при отсутствии твердых знаний в определении видов грибов, можно перепутать мухомор красный с другими схожими видами (мухомор вонючий, мухомор поганковидный, и даже с бледной поганкой), что несет прямую угрозу жизни и здоровью. Если Вы не обладаете соответствующими знаниями, не пытайтесь самостоятельно собирать грибы.

Преамбула

Давно хотел написать про сабж, а сегодня вот [info]glebo@ljr с началом сезона поздравляет. Я уже пару лет назад насмотрелся и наслушался Вишневского, и все хотел проверить на себе, як воно.

Естественно, перед всеми экспериментами 5 дней не употреблялось других психоактивных веществ, в т.ч. и алкоголя. Исключение — никотин.

Недотрип первый

В прошлом 2020 году, где-то в начале сентября, я таки собрался за мухоморами, собрал. Доза — две средних взрослых (раскрывшихся) шляпки, и две молодых (нераскрывшихся). Фото в прошлый раз, к сожалению, не делал.
Употребление: необработанными с солью.
Эффект: где-то минут через 40 появился звон в ушах, немного затормозилось восприятие окружающего, были очень слабые визуалы, буквально на периферии зрения, вроде как капли воды на объективе фотоаппарата, когда в визор смотришь, впрочем, они быстро пропадали. Постепенно к горлу подкатывал ком, потом я попросил ассистента принести мне таз, сам принял лежачее положение, т.к. просто «поплохело» по общему состоянию.

В голову начали лезть странные фразы и мысли, причем по типу «Гастронома на улице Герцена», т.е. все слова нормальные, а смысла в них мало, одну даже запомнил: «Справедливость находится не на каждом разводе милиции».

Потом меня стошнило в таз, довольно мощно. Поскольку употреблял почти на голодный желудок, то вырвало довольно беспроблемно и не очень противно. Выпил сладкого морса, опять стошнило сладеньким, второй раз блевать было даже как-то по кайфу.

После рвоты расслабило, неприятные ощущения ушли, стало как-то кайфово, не сильно, скорее как «дички», т.е. очень лайтовой травы покурил. Включил плейлист с Ragga-Jungle миксами и просто валялся на диване, наслаждаясь музыкой и расслабоном.

Опыт второй

Буквально по горячим следам. Почему-то получился более негативным, хотя я последовал совету опытного «грибника» [info]glebo@ljr, который он давал анонимусу, также столкнувшемуся с проблемой тошноты: слегка обжарить мухоморы на сливочном масле.

Вот сырье:

Из пожаренного съел примерно три четверти, потом как-то резко не полезло, хотя, ярко выраженного кома в горле тоже не возникло, на вкус приемлемо, хотя и необычно. Но кулинар из меня говно в любом случае, так что ничего страшного. Опять все пошло во тому же сценарию, что и в предыдущем случае — какие-то легкие визуалы, когда смотрел на бетонную стену в дальнем помещении офиса, она как бы «дышала», но очень незначительно, и звон в ушах.

Потом меня отвлекли от самосозерцания — приперся какой-то коммивояжер, но я был поглощен экспериментом, потому, с одной стороны, ему повезло, я ему открыл. А с другой стороны, он меня, наверное, за наркомана ебаного принял, т.к. я просто тупо отвечал «нет» на любые его вопросы, даже по поводу, бывал ли я в «Тетрисе» (это крупный торговый центр в ПТЗ). Комми ушел несолоно хлебавши, и ему, внезапно, в этом повезло, т.к. только он ушел, мне потребовалось очень срочно блевануть, аж так срочно и неожиданно, что еле добежал до сортира. Если бы он не ушел, то был бы заблеван он, его товары, и вообще нахуй все вокруг.

После того, как протошнило, легкости, как в прошлом эксперименте, не наступило, наоборот, стало как-то тяжко и погано. Дошел до диванчика, прилег. На ютубе автоматом включился какой-то исторический выпуск с Тамарой Эдельман, от ее голоса немного полегчало, и я провалился в какой-то недосон, в котором опять же были какие-то не совсем логичные фразы и незнакомые термины, запомнил только то, что все крутилось вокруг Короля в Желтом (лавкрафтовского Хастура, как я после пробуждения понял), еще в этом какие-то то ли эльджели то ли что-то похожее по звучанию, участвовали и вроде как менты, в общем, как я потом понял, мозг что-то себе сам около-лавкрафтовское конструировал из прочитанного и окружающей действительности.

Когда недосон прошел, оставалось какое-то тяжелое состояние, примерно как около-гриппозное. Прошло вот совсем недавно, и то не полностью.

Выводы

Выводы не окончательные, скорее, очень промежуточные. Похоже, мухомор, очень индивидуальный гриб. Например, на [info]glebo@ljr и еще одного блоггера с LJR он влияет как легкий галлюциноген/энтеоген, как и на моего друга РыББу из реала. Мне не подходит в «шаманском» или «рекреационном» смысле, возможно, подойдет в более «медицинском». Заготавливаю сырье для проверки некоторых рецептов от Вишневского, и использования в микродозинге от западных исследователей.

CMD/BAT, содержит ли переменная число.

Преамбула

В BAT-файлах нет типа переменных, тип разрешается в каждом конкретном случае. Впрочем, это так в большинстве командных языков, в линуксовом bash тоже нельзя явно задать тип переменной.

При этом, процессор cmd не считает числом:

— Числа в системах счисления отличных от десятичной.
— Числа с плавающей точкой (действительные, дробные).
— Если есть лидирующие нули, например 00150 не распознается как число. Хотя с этим мы поборемся.

Числами считаются только целые числа в диапазоне -2147483648..2147483647.

Так как же проверить, число в переменной BAT/CMD-файла или нет? Будем разбираться.

Оставим числа в системах счисления, отличных от десятичной, а также дробные числа. Нормальных механизмов работы в BAT/CMD с ними нет, так что и не будем усложнять.

Решение

1. Включаем расширенный режим (копия) обработки команд. В Windows, начиная с XP SP2 он включен по умолчанию, но лучше явно прописывать для совместимости:

SetLocal EnableExtensions

2. Проверка на пустую переменную. Процессор BAT/CMD считает неинициализированную или пустую переменную пустой, и не задает ей значение 0, если она используется в качестве численной переменной. Так что изначально надо проверять, не пуста ли переменная.
В тестовом примере значение передается в параметре командной строки, его и проверим, а потом запишем значение во внутреннюю переменную скрипта:

rem test if no or void parameter (variable)
if "%~1" == "" (
	echo No arguments. Use  "%~n0%~x0  <test pattern>"
	exit /b 1
)

set INP=%~1

%~n0%~x0 — при расширенной обработке команд %~n достает из переменной, в данном случае переменной %0 имя файла, %~x расширение с точкой. %0 — переменная, содержащая путь к BAT/CMD-файлу

3. Боремся с лидирующими нолями. Данная команда их удалит:

for /f "tokens=* delims=0" %%a in ("%INP%") do set INP=%%a

4. Эта команда сохранит, например 000100, превратив его в 100, но удалит 0 или 000..., так что если переменная после операции оказалась пустой, значит она содержала 0, надо его восстановить, дабы далее избежать ошибок:

if "%INP%" == "" (
set INP=0
)

5. Число или строка. Теперь можно определить, число или строка в переменной, произведя над ней арифметическое действие не изменяющее значение, например, умножение на 1. Сделать это можно с помощью команды set /a. Остается сравнить полученный результат с оригиналом. Если результат операции не равен оригиналу, то в переменной не число, а строка, т.к. результат арифметической операции над строкой всегда будет равен 0:

rem number or not number
set /a "TINP=INP*1"
if NOT %TINP% == %INP% (
	echo Not number!
	exit /b 2
)

6. Положительное или отрицательное число. Далее остается только сравнить числа с 0 с помощью оператора IF и операций сравнения:

Операнд сравнения Описание
EQU Равно
NEQ Не равно
LSS Меньше
LEQ Меньше или равно
GTR Больше
GEQ Больше или равно

rem number type
if %INP% GEQ 0 (
	echo Positive integer
	exit /b 0
)
if %INP% LSS 0 (
	echo Negative integer
	exit /b 0
)

Скрипт целиком

На GitHub