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

时间:2020-01-27 21:12:04

标签: windows git powershell

我想将git log的输出分配给一个变量,输出仅转到屏幕,并且变量保留为空。

app      | Error: Cannot find module '/usr/src/app/dist/index.js'

我想做的是创建一个数组,其中包含所有行,但不包括显示为空的行。

2 个答案:

答案 0 :(得分:2)

要从PowerShell中的多个语句捕获输出,请将它们包含在 script块{ ... })中,然后用{{1}调用} (或使用&,如果您希望代码直接在调用者的作用域中运行,但是调用外部程序(如则没有区别) ):

git

如果您还需要捕获来自外部程序的 stderr 输出,例如$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,但请注意{ {1}}通常只输出到 stdout ,因此不需要额外的工作。

这是一个2>&1 | % ToString命令的简单示例,该命令同时生成stdout和stderr输出,以及如何在PowerShell变量中同时捕获

git log

注意:

  • cmd.exe的上下文中,您可以将$out = cmd /c 'ver & nosuch' 2>&1 | % ToString 应用于整个命令组(& { ... });或(2>&1 | % ToString)内的单个命令

  • & { foo.exe; <# ...#> } 2>&1 | % ToString可能会有意外的副作用-有关背景信息,请参见this answer


我想做的是创建一个数组,其中包含所有行,但不包括显示为空的行。

如果外部程序输出包含多于1行,PowerShell会自动以单个行 数组捕获输出。 >

要简单地从此类数组中删除空行,请使用:

& { foo.exe 2>&1 | % ToString; <# .. #> }

关于您尝试过的事情

2>&1

由于您的命令行由多个# 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捕获的内容只是 first 语句的输出,;-并且由于$log = ...产生 no 输出,因此Push-Location $tempRepo有效地以Push-Location结尾。

答案 1 :(得分: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'}
相关问题