Как следует из комментария Ансгара: В Windows Start-Process
по умолчанию запускает консольные программы в новом окне консоли , асинхронно .
Если это программа быстро завершается, вы можете увидеть новую вспышку окна консоли только ненадолго, так как она вскоре откроется и скоро закроется, или вы можете вообще пропустить флеш - в любом случае ее вывод не будет отображаться в консоли вызывающего абонента window.
Добавление -Wait
к вызову Start-Process
вызовет вызов синхронный , а добавление -NoNewWindow
заставит его запустить в той же консоли , но сеанс вызова PowerShell не смог бы захватить или перенаправить вывод выведенной программы - см. ниже.
Сделаем шаг назад: не используйте Start-Process
если вы хотите запустить консольную программу синхронно , с ее стандартными потоками , подключенными к потокам PowerShell - просто вызовите такую программу прямо :
packages/mdoc/tools/mdoc.exe --version
Если путь / имя внешней программы должен быть указан (поскольку его путь содержит пробелы) и / или хранится в переменной , просто используйте &
, оператор вызова, чтобы вызвать его:
# Via a quoted string:
& "packages/mdoc/tools/mdoc.exe" --version
# Via a variable:
$exePath = "packages/mdoc/tools/mdoc.exe"
& $exePath --version
Использование подхода прямого вызова дает вам синхронное выполнение бесплатно, а также возможность захвата и / или перенаправления потоков stdout и stderr вызываемой программы.
Чтобы собрать все это (на основе ваших более поздних комментариев):
nuget install mdoc -OutputDirectory packages -ExcludeVersion
$exePath = "packages/mdoc/tools/mdoc.exe"
& $exePath --version
"done"
Это печатает номер версии - mdoc 5.7.2
на момент написания этой статьи - перед печатью done
(проверено в Windows PowerShell v5.1.17134.48 на Microsoft Windows 10 Pro (64-разрядная; Версия 1709, ОС: 16299.371)).
Дополнительное чтение: Запись stdout / stderr выход из внешних программ:
Для захвата stdout , просто назначьте вызов переменной:
$version = & $exePath --version # $version receives stdout output as an *array of lines*
$version
получает либо строковый скаляр (одиночная строка), если только одна строка выводится, либо array строк, представляющих выходные линии.
Чтобы также захватить вывод stderr , используйте перенаправление 2>&1
:
[string[]] $allOutput = & $exePath --version 2>&1
Обратите внимание на cast на [string[]]
, который гарантирует, что строки stderr будут захватываться как строки .
[System.Management.Automation.ErrorRecord]
, которые в Windows PowerShell будут несколько путать их, как если бы они были PowerShell ошибки - эта проблема была исправлена в PowerShell Core . -is [System.Management.Automation.ErrorRecord]
, чтобы определить, возникла ли она из stdout или stderr. factory
позволяет возвращать подтипы, что очень полезно.
Например, вы можете получить factory MyClass.empty => const _EmpytMyClass()
и вернуть тривиальную реализацию без хранилища.
Вы также можете использовать его для возврата кэшированных значений, если вы хотите иметь канонические экземпляры вашего класса.
Вы также можете использовать factory
для вызова методов для создания ваших экземпляров. Смотрите здесь https://github.com/dart-lang/json_serializable/blob/4033f6ad4e3c96bc2ed16d93c0995e11fcfe42df/example/lib/example.dart#L29