将git log的输出分配给PowerShell变量

3
我想将git log的输出赋值给一个变量,但是输出只显示在屏幕上,变量没有值。
$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.GetType()

同时,我想要创建一个数组,其中包含所有非空行。

2个回答

3
为了从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

注意:

  • & { ... }的上下文中,您可以自由地将2>&1 | % ToString应用于整个命令组(& { foo.exe; <# ...#> } 2>&1 | % ToString)或内部的单个命令(& { 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 = ... 只捕获了第一个语句 Push-Location $tempRepo 的输出结果;由于 Push-Location 没有产生任何输出,所以 $log 最终变成了 $null


0
你可以将你的命令包装在一个类似于记录的脚本中:
Start-Transcript -Path transcript.txt -NoClobber 

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

Stop-Transcript
$log = Get-Content transcript.txt | ? {$_ -match 'regex to filter unwanted lines'}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接