17

如果路径以\.

C:\Ravi\

我需要更改为

C:\Ravi

我有一种情况,路径不会以\(然后它必须跳过)结束。

我试过了.EndsWith("\"),但是当我有\\而不是\

这可以在不借助条件的情况下在 PowerShell 中完成吗?

4

4 回答 4

49

考虑TrimEnd改用(尤其是在使用UNCPath 时):

"C:\Ravi\".TrimEnd('\')
于 2016-05-09T11:45:27.163 回答
8

无需过于复杂

"C:\Ravi\".trim('\')
于 2016-05-09T11:27:57.553 回答
3

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

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

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

正则表达式意味着:

  1. 尽可能多的字符串,
  2. 直到不是反斜杠的东西
  3. 后跟一个反斜杠

给予:

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

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

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

于 2016-05-09T13:17:31.057 回答
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:\
\
\

请注意根路径现在如何以 (one) 结尾\

根路径的特殊情况很麻烦,这就是为什么有时最好确保而不是删除尾随\/(例如C:\Ravi-> C:\Ravi\),以便通过简单的字符串连接来构建路径(不必担心加倍\字符.); 正则表达式再次变得简单:

'C:\Ravi', 'C:\Ravi\', 'C:\', 'C:\\', '\', '\\' | % { 
  ($_ -replace '[\\/]+$') + '\'
}

这产生:

C:\Ravi\
C:\Ravi\
C:\
C:\
\
\

请注意所有路径现在如何以 (one) 结尾\


[1] 有时字符串操作是必要的,但通常您可以依赖Join-Pathcmdlet为您构建路径,它可以\优雅地处理目录部分中的尾随(例如,Join-Path C:\Ravi\ file.txtyield C:\Ravi\file.txt);相比之下,\\保留了尾随:Join-Path C:\Ravi\\ file.txtyield C:\Ravi\\file.txt;然而,虽然这并不漂亮,但它通常是良性的(这样的路径仍然适用于访问文件系统)。

于 2018-03-15T11:32:00.810 回答