Назначение вывода git log для переменной powershell - PullRequest
2 голосов
/ 28 января 2020

Я хочу назначить вывод 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 ]

2 голосов
/ 28 января 2020

Чтобы получить выходные данные из нескольких операторов в 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.

0 голосов
/ 28 января 2020

Вы можете заключить свои команды в расшифровку следующим образом:

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'}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...