如何在 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
运算符支持 正则表达式 作为分隔符定义这一事实,并且字符集 [/:]
与(单个) /
和一个 :
我有如下域列表:
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
运算符支持 正则表达式 作为分隔符定义这一事实,并且字符集 [/:]
与(单个) /
和一个 :