Разбор Powershell - PullRequest
       21

Разбор Powershell

0 голосов
/ 01 ноября 2018

У меня есть входные данные из журнала GIT:

Merge: d9335ae 7d12d50
Author: name\name <mail@mail.com>
Date:   Wed Oct 31 12:55:00 2018 -0500

id:202847 Merge branch 'release/2.6.0' into release/3.0.0

# Conflicts:
#   configuration/path/path

Мне нужно проанализировать id:xxxxx и затем передать этот идентификатор в API целевого процесса, который возвращает имя идентификатора.

У меня есть пользовательская функция PowerShell, которая выполняет это.
Мне нужна помощь, чтобы объединить это в одну функцию PowerShell, которая делает это. мое регулярное выражение для совпадения с идентификатором простое id:\d+

Мой желаемый результат - вывод, похожий на приведенный ниже (текст после идентификатора - это то, что возвращается из целевого процесса)

TP Id:202847 Professional Lines: 2,800,000 Policy Aggregate Limit update

Ответы [ 2 ]

0 голосов
/ 01 ноября 2018

Чтобы предложить более идиоматическую альтернативу PowerShell:

# Sample log text (multi-line string in the form of a here-string).
$logText = @'
Merge: d9335ae 7d12d50
Author: name\name <mail@mail.com>
Date:   Wed Oct 31 12:55:00 2018 -0500

id:202847 Merge branch 'release/2.6.0' into release/3.0.0

# Conflicts:
#   configuration/path/path
'@

# Extract the ID number alone, via a capture group `(...)`, using the
# -match regex operator and the automatic $Matches variable that reflects the 
# results.
# Entry 1 of $Matches contains the 1st (and here only) capture-group value.
# \b is used to make the regex more robust, by only matching at word boundaries.
# With the sample input, $id receives value '202847'
$id = if ($logText -match '\bid:(\d+)\b') { $Matches[1] }

# Note: If your input comes directly from a *file*, say 'commit.log', 
#       use the following command instead:
#
#  $id = (Select-String -list '\bid:(\d+)\b' commit.log).Matches.Groups[1].Value
#
# Alternatively, if reading the whole file into memory at once is acceptable,
# pass (Get-Content -Raw commit.log) instead of $logText to -match.

# Build the desired output string from the ID obtained and the API return value.
"TP Id:$id " + $returnValFromApi
0 голосов
/ 01 ноября 2018

PowerShell имеет очень мощную встроенную поддержку Regex, и вы можете довольно легко получить значение идентификатора из ваших команд git, например. Мы начнем с захвата вывода вашей команды git (в моем случае я вставил его в переменную, но вы также можете запустить $CommitMsg = git commit 202847, чтобы записать вывод в переменную другим способом:)

$r="Merge: d9335ae 7d12d50
Author: name\name <mail@mail.com>
Date:   Wed Oct 31 12:55:00 2018 -0500

id:202847 Merge branch 'release/2.6.0' into release/3.0.0

# Conflicts:
#   configuration/path/path"

Далее я использую ускоритель регулярных выражений PowerShell ([regex], PowerShell имеет много полезных ускорителей! ), чтобы просмотреть переменную $r на предмет совпадений с шаблоном регулярных выражений id:.....\w+, который выглядит для строки, которая начинается с id: и имеет шесть символов после нее, затем пробел.

[regex]::Match($r, "id:(.....)\w+").Value
>id:202847

Вы можете сохранить этот вывод в переменной следующим образом:

$CommitID = [regex]::Match($r, "id:(.....)\w+").Value

, а затем внедрите это в другую команду, используя расширение строки, например:

"TP $CommitID Professional Lines: 2,800,000 Policy Aggregate Limit update"
>TP Id:202847 Professional Lines: 2,800,000 Policy Aggregate Limit update
...