PowerShell Проблемы с получением строки из файла

проблема

Я работаю над сценарием автоматического управления версиями в powershell и попал в ловушку, в которой я пытаюсь извлечь строку текста из файла AssemblyInfo.cs. Однако я не могу заставить его работать так, как ожидалось, несмотря на все мои усилия.

После многих проб и ошибок для достижения намеченных результатов я пришел к следующему, чтобы приблизиться к тому, чего я пытаюсь достичь:

# Constants
$Assembly = Get-Item "C:\generalfilepath\*\Assembly.cs"
$regex = '(?<!\/\/ \[assembly: AssemblyVersion\(")(?<=\[assembly: AssemblyVersion\(")[^"]*'

$CurrentVersion = GC $Assembly
$CurrentVersion = $CurrentVersion -match $regex

Write-Host "CurrentVersion = $CurrentVersion

Я ожидаю увидеть: CurrentVersion = 1.0.0.0 или что-то подобное, но то, что я получаю, это: CurrentVersion = [assembly: AssemblyVersion("1.0.0.0")]

Я искал повсюду примеры того, как правильно использовать регулярные выражения в PowerShell, но на самом деле я не нашел ничего, что содержало бы больше, чем само регулярное выражение... Поэтому я надеялся, что кто-то здесь может помочь мне либо направить меня в правильное направление или указать, что я делаю неправильно.

Вопрос

Несмотря на использование фильтра регулярных выражений, я получаю всю строку вместо только того значения, которое мне нужно. Как я могу гарантировать, что переменная хранит ТОЛЬКО целевое значение, используя фильтры регулярных выражений lookbehind и lookahead?

1 ответ

Решение

Ты можешь попробовать:

C:\> ([string] (Get-Content \AssemblyInfo.cs)) -match 'AssemblyVersion\("([0-9]+(\.([0-9]+|\*)){1,3}){1}"\)'
True

После этого результат должен быть сохранен в $Matches[1]

C:\> $Matches[1]
6.589.0.123

Будьте в курсе, чтобы бросить результаты Get-Content в [string] иначе $Matches будет $null, Смотрите этот ответ для полного описания.

Если вы хотите использовать более "жадные" регулярные выражения, такие как ^\[assembly: AssemblyVersion\("([0-9]+(\.([0-9]+|\*)){1,3}){1}"\) который также включает в себя проверку (^\[assembly:) что строка начинается с [assembly Вы должны пройти через [string[]] массив Get-Content возвращает:

> gc .\AssemblyInfo.cs | % { $_ -match '^\[assembly: AssemblyVersion\("([0-9]+(\.([0-9]+|\*)){1,3}){1}"\)' }

> $Matches[1]
6.589.0.*

Надеюсь, это поможет.

Другие вопросы по тегам