Powershell: вытащить URL из строки - PullRequest
0 голосов
/ 27 февраля 2019

Я вытаскиваю строку из текстового файла, который выглядит следующим образом:

C:\Users\users\Documents\Firefox\tools\Install.ps1:37:    Url = "https://somewebsite.com"

Мне нужно кое-как удалить все, кроме URL, поэтому он должен выглядеть следующим образом:

https://www.somewebsite.com

Вот что я пробовал:

$Urlselect = Select-String -Path "$zipPath\tools\chocolateyInstall.ps1"  -Pattern "url","Url"-List # Selects URL download path
$Urlselect = $Urlselect -replace ".*" ","" -replace ""*.","" # remove everything but the download link

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

1 Ответ

0 голосов
/ 27 февраля 2019

Я предлагаю использовать оператор 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

...