Исполняемый файл Powershell не выводит на STDOUT

Ссылочные переменные позволяют двум именам имен обращаться к одному и тому же адресу:

int main()
{
    int var1;

    // var2 is a reference variable, holds same value as var1

    int &var2 = var1;
    var1 = 10;

    std::cout << "var1 = " << var1 << std::endl;
    std::cout << "var2 = " << var2 << std::endl;
}

Ресурс: LINK

1
задан Joel Martinez 13 July 2018 в 21:44
поделиться

1 ответ

Как следует из комментария Ансгара: В 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.
2
ответ дан mklement0 17 August 2018 в 12:07
поделиться
  • 1
    как я упоминал в других комментариях, мне должно было быть ясно, что я сделал попробовал использовать символ & для запуска программы. Если я попробую: `` `nuget install mdoc -OutputDirectory packages -ExcludeVersion $ exePath = & quot; packages / mdoc / tools / mdoc.exe & quot; & Амп; $ exePath --version # start-process & quot; пакеты / mdoc / tools / mdoc.exe & quot; & Quot; - версия & Quot; -Wait -NoNewWindow echo & quot; done & quot; `` `... версия не печатается, как это было бы, если бы я выполнил программу вне сценария powershell – Joel Martinez 16 July 2018 в 13:24
  • 2
    @JoelMartinez: Похоже, в вашей настройке есть что-то необычное - посмотрите мое обновление, запустите точный код и посмотрите, не по-прежнему ли он работает. Если это не так, вам нужно предоставить дополнительную информацию о вашей среде (версия ОС, версия PS, терминал (консоль)). – mklement0 16 July 2018 в 15:46
  • 3
    @JoelMartinez: Любые новые результаты? – mklement0 19 July 2018 в 02:28
Другие вопросы по тегам:

Похожие вопросы: