我有一个域列表,如下:
facebook.com
youtube.com/video
google.com/
github.com/something/somewhere
microsoft.com/default.aspx
现在,我想使用PowerShell对具有预期结果的子字符串进行如下操作,以创建干净的格式
facebook.com
youtube.com
google.com
github.com
microsoft.com
使用以下PowerShell,
ForEach($website in $list){
$finalList = $website.Substring(0,$website.IndexOf('/'))
Write-Output $finalList
}
此PowerShell的问题是,当循环在 facebook.co 上运行时,它抛出错误异常,调用带有“ 2”参数的“ Substring”:“长度不能为小于零。,因为 facebook.com 没有正斜杠(/),因此索引始终返回-1
我正在考虑一种排除facebook.com的方法,但似乎仍然找不到更好的方法。
答案 0 :(得分:3)
尽管在PowerShell中直接使用.NET类型的方法 -例如.Substring()
类型的[string]
-始终是一种选择,但是PowerShell的本机功能通常会提供更多简洁优雅的解决方案:
# Create the list (an array of strings).
$list = @'
facebook.com
youtube.com/video
google.com/
github.com/something/somewhere
microsoft.com/default.aspx
'@ -split '\r?\n'
foreach ($website in $list) {
# Split the list element by '/' (if present) and output the 1st token.
($website -split '/')[0]
}
以上结果:
facebook.com
youtube.com
google.com
github.com
microsoft.com
-split
operator返回基于RHS分隔符($website
)的LHS(/
)中包含的令牌数组,索引[0]
返回第一个这样的令牌
如果LHS恰好不包含分隔符的实例,则返回一个单元素数组,仍然可以使用索引[0]
安全地访问它。
如果URL列表中还包含端口号(例如website.com:8888
),请按如下所示修改split命令:
($website -split '[/:]')[0]
这利用了以下事实:-split
运算符支持正则表达式作为分隔符定义,并且字符集[/:]
与(单个){{1} }和/