为了从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 }
如果您需要捕获外部程序(例如git)的stderr输出,请在调用末尾添加2>&1 | % ToString
,但注意git log
通常只输出到stdout,因此不需要额外的努力。
这是一个简单的cmd.exe
命令示例,它会产生stdout和stderr输出,以及如何在PowerShell变量中捕获两者。
$out = cmd /c 'ver & nosuch' 2>&1 | % ToString
注意:
我想做的是创建一个数组,其中包含所有不为空的行。
如果外部程序输出超过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 = ...
只捕获了第一个语句 Push-Location $tempRepo
的输出结果;由于 Push-Location
没有产生任何输出,所以 $log
最终变成了 $null
。