Консольное приложение C #: писать в консоль PowerShell без отправки в конвейер? - PullRequest
0 голосов
/ 08 ноября 2019

У меня есть следующее базовое приложение C # .Net.

class Program
{
    static void Main(string[] args)
    {
        ???.WriteLine("yyy"); // Need to display "yyy" always even when running $a = .\test.exe in the powershell console
        Console.WriteLine("xxx"); // "xxx" can be sent to the PowerShell pipeline
    }
}

Следующий код Powershell присваивает "xxx" $a. Я хочу отобразить «yyy» на консоли.

$a = .\Test.exe # $a got "xxx". Nothing is displayed

Что если я хочу вывести на консоль какой-нибудь другой текст, прежде чем присваивать окончательный результат $a?

Ответы [ 2 ]

1 голос
/ 11 ноября 2019

Примечание. Следующее относится к запуску PowerShell в консольном окне (терминал), как это обычно бывает, но учтите, что PowerShell можно размещать и в не консольных приложениях.

Ваш единственный вариант - записать текст, который вы не хотите, чтобы PowerShell записывал через поток вывода об успешном завершении, в stderr (стандартный поток ошибок), а не stdout (стандартный поток вывода):

  • Console.WriteLine() фактически совпадает с Console.Out.WriteLine(), т. е. записывает в stdout , который PowerShell отображает в свой Успешный выходной поток , что означает, что выходные данные могут быть захвачены в переменной или переданы через конвейер для дальнейшей обработки.

  • Console.Error.WriteLine(), напротив, записывает в stderr , через который PowerShell проходит на консоль (дисплей) по умолчанию (о том, как ее захватить, см. Ниже).

class Program
{
    static void Main(string[] args)
    {
        Console.Error.WriteLine("yyy"); // -> stderr; prints to the console by default
        Console.WriteLine("xxx"); // "xxx" can be sent to the PowerShell pipeline
    }
}

Обратите внимание, что возможно также захватить stderr вывод, а именно через перенаправление 2>:

  • 2>&1 объединяет вывод stderr в поток вывода PowerShell для успешного завершения, так что выходные данные как stderr, так и stdout могут быть захвачены;обратите внимание, что строки, полученные через stderr, фактически фиксируются как System.Management.Automation.ErrorRecord экземпляров.

  • 2> stderr.txt сохраняет вывод stderr в файл stderr.txt

Обратите внимание, что хотя обычные консольные программы имеют только 2 выходных потоков - stdout и stderr - PowerShell внутренне поддерживает 6 выходных потоков, как описано в about_Redirection . [2]


[2] На системном уровне только stdout и stderr существуют как выходные потоки для связи между процессами, поэтому PowerShell должен сопоставлять свои внутренние потоки им обоим при получениивывод и отправка вывода на внешние программы.

0 голосов
/ 08 ноября 2019

Если вы поместите $ a в свою строку в скрипте Powershell, он будет записан в консоль.

$a = .\Test.exe # $a got Hello World. Nothing is displayed
$a # <== this line should write the value of $a to the console
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...