我认为我需要的是一个表达式来排除字符的第3和第4个实例之外的任何内容,在这种情况下是反斜杠。听起来不错吗?
我试图解决的问题是如何从PowerShell中的给定UNC路径获取ShareName。
查找:" Share01"在示例源字符串中:
\\FQDN\Share01\Directories\...\...\...\...
PowerShell的Split-Path
在这方面被证明有点受限,RegEx很难!
答案 0 :(得分:9)
我这次聚会真的很晚,但我会建议一个替代方案:使用[Uri]
类型:
$unc = '\\FQDN\Share01\Directories\...\...\...\...'
$upath = [Uri]$unc
$upath.IsUnc
$upath.Segments[1] # Returns Share01/
$upath.Segments[1].Trim('/') # Trims the trailing /
[System.IO.Path]::GetPathRoot($unc).Split('\')[-1]
答案 1 :(得分:8)
在简单的场景中,我会使用类似于@Avshalom建议的方法,但使用String.Split()
方法而不是-split
运算符来避免使用正则表达式。
$unc = '\\FQDN\Share01\Directories\...\...\...\...'
$sharename = $unc.Split('\')[3]
如果您想要安全起见,首先应该规范路径分隔符,因为PowerShell接受/
和\
作为路径中的分隔符:
$sharename = $unc.Replace('/', '\').Split('\')[3]
如果你想玩它真的很安全,可能没有办法解决正则表达式问题,因为有很多事情要处理:
\
和/
。.//some\\\folder/\path
是PowerShell中的有效路径规范)。要处理所有这些,您可以执行以下操作:
$unc = '\\FQDN\Share01\Directories\...\...\...\...'
$re = '^[\\/]{2}[^\\/]+[\\/]+([^\\/]+)'
if ($unc -match $re) {
$sharename = $matches[1]
} else {
"Not a valid UNC path: $unc"
}
正则表达式细分:
^[\\/]{2}
匹配字符串开头的两个连续斜杠或反斜杠。[^\\/]+
匹配一个或多个既不是斜杠也不反斜杠的字符序列(即路径组件)。[\\/]+
匹配连续路径分隔符。(...)
将子匹配(在本例中为共享名称)分组,以便可以对其进行反向引用,例如通过automatic variable $matches
。答案 2 :(得分:4)
另一种选择:
('\\FQDN\Share01\Directories\...\...\...\...' -split '\\' | ? {$_} )[1]
答案 3 :(得分:0)
为您的搜索修改此代码:
$value="\\FQDN\Share01\Directories\...\...\...\..."
$valuetosearch="Share01"
$listresult=$value -split "\\"
$counter = 0
$listresult | select @{Name="Value";Expression={$_}}, @{Name="Rang";Expression={$global:counter; $global:counter++}} | where { $_.Rang -eq 3 -and $_.Value -eq $valuetosearch}