Я предлагаю использовать оператор switch
с параметрами -Regex
и -File
:
$url = switch -regex -file "$zipPath\tools\chocolateyInstall.ps1" {
' Url = "(.*?)"' { $Matches[1]; break }
}
-file
делает цикл switch
всемстроки указанного файла. -regex
интерпретирует условные переходы как регулярные выражения , и автоматическая переменная $Matches
может использоваться в связанном блоке сценария ({ ... }
) дляполучить доступ к результатам сопоставления, в частности, то, что 1-я (и единственная) группа захвата в захваченном регулярном выражении ((...)
) - интересующий URL. break
прекращает обработку, когда найдено 1-е совпадение,(Чтобы продолжить сопоставление, используйте continue
).
Если вы хотите использовать Select-String
:
$url = Select-String -List ' Url = "(.*?)"' "$zipPath\tools\chocolateyInstall.ps1" |
ForEach-Object { $_.Matches.Groups[1].Value }
Обратите внимание, что решение switch
будетнамного лучше.
Что касается то, что вы пытались :
Select-String -Path "$zipPath\tools\chocolateyInstall.ps1" -Pattern "url","Url"
Select-String
- эторегистр нечувствителен по умолчанию, поэтому нет необходимости указывать варианты регистра для одной и той же строки.(И наоборот, вы должны использовать переключатель -CaseSensitive
для принудительного сопоставления регистров * ).
Также обратите внимание, что Select-String
не выводит соответствующую строку напрямую как строка , но как объекты с информацией о совпадении ;чтобы получить соответствующую строку, откройте свойство .Line
[1] .
$Urlselect -replace ".*" ","" -replace ""*.",""
".*" "
и ""*."
приводят к синтаксическим ошибкам , потому что вы забыли escape _embedded "
как `"
.
В качестве альтернативы используйте '...'
(одинарные кавычки литерал строки), что позволяет вставлять "
как есть и, как правило, предпочтительнее для регулярных выражений и операндов замены, потому что нетпутаница в том, какие части PowerShell может интерпретировать заранее (расширение строки).
Однако даже если проблема с выходом решена, ваши операции -replace
не будут работать, поскольку .*"
соответствует жадно и, следовательно, до последний "
;вот исправленное решение с не жадным соответствием и с опущенным операндом замены (что делает его по умолчанию пустой строкой):
PS> 'C:\...ps1:37: Url = "https://somewebsite.com"' -replace '^.*?"' -replace '"$'
https://somewebsite.com
^.*?"
non-жадно заменяет все до first "
. "$
заменяет "
в конце строки.
Однако выможет сделать это с помощью операции single -replace
, используя то же регулярное выражение, что и для решения switch
в верхней части:
PS> 'C:\...ps1:37: Url = "https://somewebsite.com"' -replace '^.*?"(.*?)"', '$1'
https://somewebsite.com
$1
в операнде замены относится кчто захватила 1-я группа захвата ((...)
), то есть пустой URL;для получения дополнительной информации см. этот ответ .
[1] Обратите внимание, что есть предложение с подсвеченным зеленым цветом - еще не реализовано в Windows PowerShell Core 6.2.0- разрешить Select-String
напрямую генерировать строки, используя предложенный переключатель -Raw
- см. https://github.com/PowerShell/PowerShell/issues/7713