我想将git log的输出分配给一个变量,输出仅转到屏幕,并且变量保留为空。
app | Error: Cannot find module '/usr/src/app/dist/index.js'
我想做的是创建一个数组,其中包含所有行,但不包括显示为空的行。
答案 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'}