Ссылочные переменные позволяют двум именам имен обращаться к одному и тому же адресу:
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
Как следует из комментария Ансгара: В 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.
&
для запуска программы. Если я попробую: `` `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