如何在 PowerShell 中处理具有动态长度的子字符串

How to handle substring with dynamic length in PowerShell

我有如下域列表:

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.com 时抛出错误 Exception calling "Substring" with "2" argument(s): "Length cannot be less than zero. 因为 facebook.com 没有正斜杠 (/) 所以索引总是 returns -1

我正在考虑排除 facebook.com 的方法,但似乎仍然找不到更好的方法。

虽然在 PowerShell 中直接 使用 .NET 类型的方法 - 例如 [string] 类型的 .Substring() - 始终是一个选项,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 returns LHS ($website) 中包含的令牌数组基于 RHS 分隔符 (/) 和索引 [0] returns 第一个这样的标记。

如果 LHS 恰好不包含分隔符的实例,则返回一个单元素数组,仍然可以使用索引 [0].

安全地访问它

如果URL列表中还包含端口号(如website.com:8888)修改拆分命令如下:

($website -split '[/:]')[0]

这利用了 -split 运算符支持 正则表达式 作为分隔符定义这一事实,并且字符集 [/:] 与(单个) / 和一个 :