<code>\</code>

问题描述 投票:0回答:4
我有一个情况,路径不会以

\

的结尾(然后必须跳过)。

我尝试了
.EndsWith("\")

,但是当我拥有
\\
而不是

\

时,它会失败。
可以在PowerShell中完成此操作,而无需诉诸条件吗?
    

使用

TrimEnd

(尤其是在使用

UNC
路径)的情况下:
"C:\Ravi\".TrimEnd('\')
    

不需要过度complate

powershell filepath text-parsing ends-with
4个回答
60
投票

您提到的是需要区分“ \”和“ \”中结束的路径,并可能以不同的方式处理这些路径。虽然您可以使用
.Trim("\")
.TrimEnd("\")

在您给出的示例中删除尾随的“ \”字符,但是这两种方法都会从您的路径上剥离taild slash。
如果您的路径以单个“ \”结束,则以下正则返回
True

9
投票
$Path -match '.+[^\\]\\$'

the Regex的意思是:

尽可能多的字符串,

3
投票
对不是后踢的东西 theake theBackslash

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

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


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

注:仅当您需要修剪大多数2 tailt
\
字符时,此解决方案才引起人们的兴趣。 如果可以接受thailing chars的非空运行,即也可以接受

3或更多(在这种情况下很可能),并且

root
    路径无需特殊处理,请使用
  1. martinbrandl的简单解决方案。
  2. 基于PowerShell的
  3. /
  4. 运算符的解决方案
  5. 具有指定表达式
处理tailding

\

-replace
且还可以与

\

一起使用,鉴于PowerShell同时接受

2
投票

/作为路径分离器(这也将使解决方案与PowerShell孔一起使用powershellcore

,cross-platfom Edition):cross-platfom Edition)

\


/是一个字符类(
# 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:导致了
    emptiment。
    
    
    将此 - 通过在这些特殊情况下留下tailding c,需要一个更复杂的正则(通过匹配任意数量的后路径分离器来稍微简化):
    \
    this屈服:
    \
    注意,根路径现在如何在(一个)
    'C:\Ravi', 'C:\Ravi\', 'C:\', 'C:\\', '\', '\\' | % { $_ -replace '(?:^((?:[a-z]:)?\\)\\*$)|(.*?)(?:\\+)$', '$1$2' }

    .
  • 中结束
  • 根路径的特殊评估很麻烦,这就是为什么它比以上是

    而不是删除尾随的C:\Ravi C:\Ravi C:\ C:\ \ \

    \
(例如,

\

->
/
),以便促进具有简单的弦串联的构建路径(不必担心加倍的chars。);正则再次变得简单:

C:\Ravi
this屈服:

C:\Ravi\ 注意

all
路径现在如何以(一个)结尾。
[1]有时是必要的,但是cmdlet
可以依靠\

cmdlet

来为您构建路径,该路径可以优雅地处理目录部分中的taffing

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

C:\Ravi\ C:\Ravi\ C:\ C:\ \ \
产量
\

);相比之下,保留了尾随的

Join-Path
\

屈服

Join-Path C:\Ravi\ file.txt
;但是,虽然这并不漂亮,但通常是良性的(此类路径仍然可用于访问文件系统)。

有一个.net方法可以做到这一点: C:\Ravi\file.txt

这很棒的是它是自我记录的。它传达给读者您在做什么。
另一个不错的事情是,它还可以在其他操作系统(例如使用前向斜线的Linux)上使用:
\\
	
最新问题
© www.soinside.com 2019 - 2025. All rights reserved.