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.*
Надеюсь, это поможет.