注意:此解决方案仅在您需要修剪 最多 2 个尾随 \ 字符、想要支持 / 路径分隔符、想要处理 root路径正确或通常对正则表达式技术感兴趣。
如果可以修剪 任何 非空的尾随 \ 字符运行,也就是 3 或更多 em>(在这种情况下很可能)和 root 路径不需要特殊处理,使用 Martin Brandl's simple solution。
一种基于 PowerShell 的 -replace operator 和 regular expression 的解决方案,它处理尾随 \ 和 \\ 并且也适用于 /,因为 PowerShell 接受 \ 和 / 作为路径分隔符(这也将使解决方案与跨平台版本的 PowerShell Core 一起使用):[1]
# Remove at most 2 trailing "\" chars.
PS> 'C:\Ravi\' -replace '[\\/]?[\\/]$'
C:\Ravi
#'# More simply, remove any number of trailing "\" chars.
PS> 'C:\Ravi\' -replace '[\\/]+$' #'# equivalent of 'C:\Ravi\'.TrimEnd('\/')
C:\Ravi
[\\/] 是一个字符类 ([...]),它匹配单个字符,即 \(转义为 \\ 以被视为文字)或 /。
[\\/]?[\\/] 匹配 一个或两个 \ 字符串末尾的实例 ($),[\\/]+ 更松散地匹配 一个或多个 em> (+)。
未指定替换字符串有效地删除字符串中的匹配项;如果没有匹配,则输入字符串保持原样。
为了证明该方法适用于各种路径,包括 UNC 路径:
'C:\Ravi', 'C:\Ravi\', 'C:/Ravi/', 'C:\Ravi\\', '\\foo\bar\', 'C:\', '\' | % {
$_ -replace '[\\/]?[\\/]$'
}
以上产出:
C:\Ravi
C:\Ravi
C:/Ravi
C:\Ravi
\\foo\bar
C:
但是请注意,根路径的处理存在问题:C:\ 被转换为 C:,而\ 导致 空 字符串。
解决这个问题 - 通过在这些特殊情况下留下尾随 \ - 需要更复杂的正则表达式(通过匹配任意数量的尾随路径分隔符稍微简化):
'C:\Ravi', 'C:\Ravi\', 'C:\', 'C:\\', '\', '\\' | % {
$_ -replace '(?:^((?:[a-z]:)?\\)\\*$)|(.*?)(?:\\+)$', '$1$2'
}
这会产生:
C:\Ravi
C:\Ravi
C:\
C:\
\
\
注意根路径现在如何以(一个)\ 结尾。
根路径的特殊情况很麻烦,这就是为什么它有时优于确保而不是删除尾随\或/(例如, C:\Ravi -> C:\Ravi\),以便于通过简单的字符串连接来构建路径(不必担心加倍 \ 字符。);正则表达式再次变得简单:
'C:\Ravi', 'C:\Ravi\', 'C:\', 'C:\\', '\', '\\' | % {
($_ -replace '[\\/]+$') + '\'
}
这会产生:
C:\Ravi\
C:\Ravi\
C:\
C:\
\
\
注意所有路径现在如何以(一个)\结尾。
[1] 有时字符串操作是必要的,但通常您可以依靠Join-Path cmdlet 为您构建路径,它可以优雅地处理目录部分中的尾随\ (例如,Join-Path C:\Ravi\ file.txt 产生 C:\Ravi\file.txt);相比之下,尾部的\\ 被保留:Join-Path C:\Ravi\\ file.txt 产生C:\Ravi\\file.txt;然而,虽然这并不漂亮,但它通常是良性的(这样的路径仍然可以访问文件系统)。