Примечание. Следующее относится к запуску 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 должен сопоставлять свои внутренние потоки им обоим при получениивывод и отправка вывода на внешние программы.