我正在从外观的文本文件中摘下字符串:
C:UsersusersDocumentsFirefoxtoolsInstall.ps1:37: Url = "https://somewebsite.com"
我需要如何删除除URL以外的所有内容,因此应该看起来像:
https://www.somewebsite.com
这是我尝试过的:
$Urlselect = Select-String -Path "$zipPathtoolschocolateyInstall.ps1" -Pattern "url","Url"-List # Selects URL download path
$Urlselect = $Urlselect -replace ".*" ","" -replace ""*.","" # remove everything but the download link
,但这并没有做任何事情。我认为它将与Regex有关,但我不确定如何提出。任何帮助都将受到赞赏。谢谢
我建议使用 -Regex
和 -File
选项使用switch
语句:
$url = switch -regex -file "$zipPathtoolschocolateyInstall.ps1" {
' Url = "(.*?)"' { $Matches[1]; break }
}
-
-file
在指定文件的所有行上制造switch
循环。 -
-regex
将分支条件解释为正则表达式,并且可以在关联的脚本块({ ... }
)中使用自动$Matches
变量,以访问比赛的结果,尤其是Regex中的第1(和唯一)捕获组((...)
)被捕获的 - 感兴趣的URL。 -
break
找到了第一个匹配项后停止处理。(要继续匹配,请使用continue
)。
如果您想使用Select-String
:
$url = Select-String -List ' Url = "(.*?)"' "$zipPathtoolschocolateyInstall.ps1" |
ForEach-Object { $_.Matches.Groups[1].Value }
请注意,switch
解决方案的性能会更好。
至于您尝试过的:
Select-String -Path "$zipPathtoolschocolateyInstall.ps1" -Pattern "url","Url"
Select-String
默认情况下是案例 - 不敏感,因此无需指定同一字符串的情况变化。(相反,您必须使用-CaseSensitive
开关来强制case-敏感匹配)。
还请注意,Select-String
不会以A String 而直接输出匹配行,而是作为匹配信息对象;要获取匹配行,请访问.Line
属性 [1] 。
$Urlselect -replace ".*" ","" -replace ""*.",""
".*" "
和 ""*."
在语法错误中导致,因为您忘记了 easce _embedded "
as `"
。
另外,使用'...'
(单引号字面字符串),它允许您嵌入"
AS-IS,通常比以后和替换操作数更可取,因为在哪些部分powershell可能不会混淆的情况下,向上解释(字符串扩展)。
即使解决了解决问题,您的-replace
操作也无法使用,因为.*"
匹配了贪婪,因此直到最后 last "
;这是使用 non-greedy 匹配的校正解决方案,并且省略了替换操作数(这使其默认为空字符串):
PS> 'C:...ps1:37: Url = "https://somewebsite.com"' -replace '^.*?"' -replace '"$'
https://somewebsite.com
-
^.*?"
非固定地将所有内容替换为"
。 -
"$
在字符串末端替换"
。
但是,您可以使用 -replace
操作进行操作,使用与顶部的switch
解决方案相同的正则
PS> 'C:...ps1:37: Url = "https://somewebsite.com"' -replace '^.*?"(.*?)"', '$1'
https://somewebsite.com
$1
在替换操作数中,指的是第一个捕获组((...)
)捕获的内容,即裸露的URL;有关更多信息,请参阅此答案。
[1]请注意,有一个绿色功能建议 - 尚未使用Windows PowerShell Core 6.2.0实现 - 允许Select-String
直接使用建议的-Raw
Switch直接发射字符串 - 请参阅https://https://github.com/powershell/powershell/issues/7713