Powershell命令修剪路径,如果它以“\”结束

时间:2016-05-09 11:26:00

标签: powershell filepath text-parsing ends-with

如果路径以>> h = {key1: 'v1', key2: 'v2'} >> h.deep_stringify_keys.to_yaml => "---\nkey1: v1\nkey2: v2\n" >> h.deep_stringify_keys.to_yaml.lines[1..-1].join => "key1: v1\nkey2: v2\n" 结尾,我需要修剪路径。

\

我需要改为

C:\Ravi\

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

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

这可以在PowerShell中完成,而无需诉诸条件吗?

4 个答案:

答案 0 :(得分:24)

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

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

答案 1 :(得分:6)

无需过度复杂化

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

答案 2 :(得分:2)

你提到需要区分以" \"结尾的路径。和" \\"并可能以不同的方式处理虽然您可以使用$Path -match '.+[^\\]\\$' "C:\Ravi\" -match '.+[^\\]\\$' True "C:\Ravi\\" -match '.+[^\\]\\$' False 删除尾随" \"您给出的示例中的字符,这两种方法都会从您的路径中删除所有尾部斜杠。

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

{{1}}

正则表达式意味着:

  1. 尽可能多的字符串
  2. 一些不是反斜杠的东西
  3. 后跟一个反斜杠
  4. ,并提供:

    {{1}}

    希望这有助于/有趣。 : - )

答案 3 :(得分:0)

注意:如果您需要修剪最多 2个尾随\字符,此解决方案才有意义。想要支持/路径分隔符,想要正确处理根路径或者通常对正则表达式技术感兴趣 如果可以接受修剪任何非空的\个字符,那么 3或更多(这很可能在这种情况下)和 root 路径不需要特殊处理,使用Martin Brandl's simple solution

基于PowerShell -replace operatorregular expression解决方案,Join-Path cmdlet同时处理\\\,同时也适用于/ 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:,而\导致为空< / em> string。

通过在这些特殊情况下留下尾随\来修复它 - 需要一个更复杂的正则表达式(通过匹配任意数量的尾随路径分隔符来略微简化):

'C:\Ravi', 'C:\Ravi\', 'C:\', 'C:\\', '\', '\\' | % { 
  $_ -replace '(?:^((?:[a-z]:)?\\)\\*$)|(.*?)(?:\\+)$', '$1$2'
}

这会产生:

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

注意根路径现在如何以(一)\结束。

根路径的特殊情况很麻烦,这就是有时优于确保而不是删除尾随\/ (例如,C:\Ravi - &gt; C:\Ravi\),以便于使用简单的字符串连接构建路径(无需担心加倍\个字符。);正则表达式再次变得简单:

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

这会产生:

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

请注意所有路径现在以(一)\结尾。

[1]有时候字符串操作是必要的,但通常你可以依靠{{3}}为你构建路径,它可以优雅地处理目录部分中的尾随\ (例如,Join-Path C:\Ravi\ file.txt会产生C:\Ravi\file.txt);相反,保留尾随\\Join-Path C:\Ravi\\ file.txt产生C:\Ravi\\file.txt;然而,虽然这不是很好,但它通常是良性的(这样的路径仍然可以用于访问文件系统)。