\
的结尾(然后必须跳过)。 我尝试了
.EndsWith("\")
,但是当我拥有\\
而不是\
可以在PowerShell中完成此操作,而无需诉诸条件吗?
使用
TrimEnd
(尤其是在使用
UNC
路径)的情况下:"C:\Ravi\".TrimEnd('\')
不需要过度complate
您提到的是需要区分“ \”和“ \”中结束的路径,并可能以不同的方式处理这些路径。虽然您可以使用
.Trim("\")
或
.TrimEnd("\")
在您给出的示例中删除尾随的“ \”字符,但是这两种方法都会从您的路径上剥离taild slash。
如果您的路径以单个“ \”结束,则以下正则返回True
$Path -match '.+[^\\]\\$'
the Regex的意思是:
尽可能多的字符串,
giving:
"C:\Ravi\" -match '.+[^\\]\\$'
True
"C:\Ravi\\" -match '.+[^\\]\\$'
False
希望这有帮助 /有趣。 :-)
注:仅当您需要修剪大多数2 tailt
\
字符时,此解决方案才引起人们的兴趣。
如果可以接受thailing chars的非空运行,即也可以接受3或更多(在这种情况下很可能),并且
root/
\
-replace
且还可以与\
/
作为路径分离器(这也将使解决方案与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
\\