如果路径以“\”结尾,使用Powershell命令修剪路径

21

如果路径以 \ 结尾,我需要将其修剪。


C:\Ravi\

我需要更改为

C:\Ravi

我有一个情况,路径不会以\结尾(那么它必须跳过)。

我尝试使用.EndsWith("\"),但当我使用\\而不是\时,它会失败。

在PowerShell中是否可以完成此操作,而不必诉诸条件语句?


1
为什么需要修剪此路径?根据您的要求,可能有更好的处理方法(例如,如果您将字符串连接到路径中,则Join-Path将在不修剪的情况下为您处理)。 - alroc
@alroc 我不是在构建路径。我是在提取然后根据需要定义。 - Ravichandra
1
Split-Path 可能对你有用。 - alroc
4个回答

56

考虑使用TrimEnd代替(尤其是当你使用UNC路径时):

"C:\Ravi\".TrimEnd('\')

10

不需要过于复杂化

"C:\Ravi\".trim('\')

5
可以这么做,但因为它从两端修剪,所以对于基于 UNC 的路径(如\\foo\bar)不适用。 - mklement0
4
"\server\Ravi".trimend('') 会修复UNC路径的问题。" - lightwing

3

您提到需要区分以“\”和“\\”结尾的路径,并可能以不同方式处理这些路径。虽然您可以使用.Trim("\").TrimEnd("\")来删除您给出的示例中的尾随“\”字符,但这两种方法将从您的路径中剥离所有尾随斜杠。

以下正则表达式将在路径以单个“\”结尾时返回True,但如果以多个“\”字符结尾,则返回false:

$Path -match '.+[^\\]\\$'

这个正则表达式的含义是:

  1. 尽可能多的字符构成一个字符串
  2. 之后跟着一个非反斜杠字符
  3. 最后跟着一个反斜杠

即:

"C:\Ravi\" -match '.+[^\\]\\$'
True

"C:\Ravi\\" -match '.+[^\\]\\$'
False

希望这有所帮助/有趣。:-)

2
注意:仅当您需要修剪最多2个尾随的\字符,想要支持/路径分隔符,想要正确处理根路径或者一般对正则表达式技巧感兴趣时,此解决方案才有意义。
如果可以接受修剪任何非空的尾随\字符序列,即也包括3个或更多(在这种情况下很可能),并且根路径不需要特殊处理,请使用Martin Brandl的简单解决方案 一种基于 PowerShell 的解决方案,使用 -replace 操作符 和一个正则表达式来处理尾随的 \\\,并且还可以使用 /,因为 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
  • [\\/]是一个字符类([...]),它匹配一个单个的字符,可以是\(转义为\\以将其视为字面量)或/

  • [\\/]?[\\/]匹配字符串末尾($)处的一个或两个\实例,[\\/]+更松散地匹配一个或多个(+)。

  • 没有指定替换字符串会有效地从字符串中删除匹配项;如果没有匹配项,则输入字符串保持不变。

为了证明该方法适用于各种路径,包括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:\
\
\

请注意,现在所有路径都以(一个)\结尾。
有时需要进行字符串操作,但通常可以依赖Join-Path cmdlet来为您构建路径,它会优雅地处理目录部分的尾随\(例如,Join-Path C:\Ravi\ file.txt 会生成 C:\Ravi\file.txt);相比之下,尾随的\\会被保留:Join-Path C:\Ravi\\ file.txt 会生成 C:\Ravi\\file.txt;但是,虽然这不太美观,但通常是无害的(这样的路径仍然可以用于访问文件系统)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接