Чтобы получить выходные данные из нескольких операторов в PowerShell, заключите их в блок сценария ({ ... }
) и вызовите его с помощью &
(или с .
, если вы хотите, чтобы код выполнялся непосредственно в области вызова, но это не имеет значения для вызова внешних программ , таких как git
):
$log = & { Push-Location $tempRepo;git init -q;git remote add origin ssh://git@git.weblnk.silverlnka.net/gxp/$repo;git fetch origin $branch -q;git log "$prevCommit..origin/$branch" --name-only --pretty=format: --full-history;Pop-Location }
Если вам также нужно захватить stderr вывод из внешних программ , например git
, добавьте 2>&1 | % ToString
к вызову, но учтите, что git log
обычно выводит только в stdout , поэтому никаких дополнительных усилий не требуется.
Вот простой пример команды cmd.exe
, которая выводит как stdout, так и stderr, и как записать оба в переменную PowerShell .
$out = cmd /c 'ver & nosuch' 2>&1 | % ToString
Примечание:
В контексте & { ... }
вы можете свободно применять 2>&1 | % ToString
к любой группе команд (* 1039). *); или для отдельных команд внутри (& { foo.exe 2>&1 | % ToString; <# .. #> }
)
2>&1
могут возникнуть непредвиденные побочные эффекты - см. этот ответ для справочной информации.
я хотел бы создать массив, содержащий все строки, кроме строк, которые кажутся пустыми.
Если вывод внешней программы содержит больше чем 1 строка, PowerShell автоматически захватывает выходные данные в массиве из отдельных строк .
Чтобы просто удалить пустые строки из такого массива, используйте:
# Assume that $out contains output captured from an external program.
@($out) -ne '' # returns sub-array of non-empty lines.
Что касается того, что вы пытались :
$log = Push-Location $tempRepo;git init -q;git remote add origin ssh://git@git.weblnk.silverlnka.net/gxp/$repo;git fetch origin $branch -q;git log "$prevCommit..origin/$branch" --name-only --pretty=format: --full-history;Pop-Location
Поскольку ваша командная строка состоит из нескольких , ;
разделенных операторов, что $log = ...
захватывает только вывод из first оператора, Push-Location $tempRepo
- и так как Push-Location
производит нет вывода, $log
эффективно заканчивается $null
.