如果路径以\
.
C:\Ravi\
我需要更改为
C:\Ravi
我有一种情况,路径不会以\
(然后它必须跳过)结束。
我试过了.EndsWith("\")
,但是当我有\\
而不是\
。
这可以在不借助条件的情况下在 PowerShell 中完成吗?
如果路径以\
.
C:\Ravi\
我需要更改为
C:\Ravi
我有一种情况,路径不会以\
(然后它必须跳过)结束。
我试过了.EndsWith("\")
,但是当我有\\
而不是\
。
这可以在不借助条件的情况下在 PowerShell 中完成吗?
考虑TrimEnd
改用(尤其是在使用UNC
Path 时):
"C:\Ravi\".TrimEnd('\')
无需过于复杂
"C:\Ravi\".trim('\')
您提到需要区分以“\”和“\\”结尾的路径,并可能以不同方式处理它们。虽然您可以在给出的示例中使用.Trim("\")
或.TrimEnd("\")
删除尾随“\”字符,但这两种方法都会从路径中删除所有尾随斜杠。
如果您的路径以单个“\”结尾,则以下正则表达式将返回True ,但如果它以多个“\”字符结尾,则返回 false:
$Path -match '.+[^\\]\\$'
正则表达式意味着:
给予:
"C:\Ravi\" -match '.+[^\\]\\$'
True
"C:\Ravi\\" -match '.+[^\\]\\$'
False
希望这有帮助/很有趣。:-)
注意:仅当您需要修剪最多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-Path
cmdlet为您构建路径,它可以\
优雅地处理目录部分中的尾随(例如,Join-Path C:\Ravi\ file.txt
yield C:\Ravi\file.txt
);相比之下,\\
保留了尾随:Join-Path C:\Ravi\\ file.txt
yield C:\Ravi\\file.txt
;然而,虽然这并不漂亮,但它通常是良性的(这样的路径仍然适用于访问文件系统)。