我建议将switch statement 与-Regex 和-File 选项一起使用:
$url = switch -regex -file "$zipPath\tools\chocolateyInstall.ps1" {
' Url = "(.*?)"' { $Matches[1]; break }
}
-
-file 使switch 循环遍历指定文件的所有行。
-
-regex 将分支条件解释为 regular expressions,并且自动 $Matches 变量可以在关联的脚本块 ({ ... }) 中用于访问匹配结果,特别是第一个(也是唯一一个)捕获的结果捕获的正则表达式 ((...)) 中的组 - 感兴趣的 URL。
-
一旦找到第一个匹配项,
break 就会停止处理。 (要继续匹配,请使用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 不会直接输出匹配行,作为字符串,而是作为match-information objects;要获取匹配行,请访问.Line 属性[1]。
$Urlselect -replace ".*" ","" -replace ""*.",""
".*" " 和""*." 导致语法错误,因为您忘记转义 _embedded " 为`"。
或者,使用'...'(单引号文字字符串),它允许您按原样嵌入",并且通常更适合正则表达式和替换操作数,因为没有混淆PowerShell 可以预先解释哪些部分(字符串扩展)。
但是,即使转义问题解决了,您的 -replace 操作也不会起作用,因为 .*" 匹配 贪婪,因此直到 last @ 987654355@;这是一个 non-greedy 匹配的更正解决方案,并且省略了替换操作数(这使其默认为空字符串):
PS> 'C:\...ps1:37: Url = "https://somewebsite.com"' -replace '^.*?"' -replace '"$'
https://somewebsite.com
-
^.*?" 非贪婪地替换所有内容,直到 first "。
-
"$ 替换字符串末尾的 "。
但是,您可以使用与顶部的switch 解决方案相同的正则表达式单个 -replace 操作来完成:
PS> 'C:\...ps1:37: Url = "https://somewebsite.com"' -replace '^.*?"(.*?)"', '$1'
https://somewebsite.com
替换操作数中的$1 指的是第一个捕获组((...))捕获的内容,即裸URL;如需更多信息,请参阅this answer。
[1] 请注意,有一个绿色功能建议 - 从 Windows PowerShell Core 6.2.0 开始尚未实现 - 允许 Select-String 使用建议的 -Raw 开关直接发出字符串 - 请参阅https://github.com/PowerShell/PowerShell/issues/7713