如果路径以 \
结尾,我需要将其修剪。
C:\Ravi\
我需要更改为
C:\Ravi
我有一个情况,路径不会以\
结尾(那么它必须跳过)。
我尝试使用.EndsWith("\")
,但当我使用\\
而不是\
时,它会失败。
在PowerShell中是否可以完成此操作,而不必诉诸条件语句?
如果路径以 \
结尾,我需要将其修剪。
C:\Ravi\
我需要更改为
C:\Ravi
我有一个情况,路径不会以\
结尾(那么它必须跳过)。
我尝试使用.EndsWith("\")
,但当我使用\\
而不是\
时,它会失败。
在PowerShell中是否可以完成此操作,而不必诉诸条件语句?
考虑使用TrimEnd
代替(尤其是当你使用UNC
路径时):
"C:\Ravi\".TrimEnd('\')
不需要过于复杂化
"C:\Ravi\".trim('\')
\\foo\bar
)不适用。 - mklement0您提到需要区分以“\”和“\\”结尾的路径,并可能以不同方式处理这些路径。虽然您可以使用.Trim("\")
或.TrimEnd("\")
来删除您给出的示例中的尾随“\”字符,但这两种方法将从您的路径中剥离所有尾随斜杠。
以下正则表达式将在路径以单个“\”结尾时返回True,但如果以多个“\”字符结尾,则返回false:
$Path -match '.+[^\\]\\$'
这个正则表达式的含义是:
即:
"C:\Ravi\" -match '.+[^\\]\\$'
True
"C:\Ravi\\" -match '.+[^\\]\\$'
False
-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:\
\
\
\
结尾。\
或/
(例如,C:\Ravi
-> C:\Ravi\
),以便于使用简单的字符串连接构建路径(无需担心加倍的\
字符)。正则表达式又变得简单了。'C:\Ravi', 'C:\Ravi\', 'C:\', 'C:\\', '\', '\\' | % {
($_ -replace '[\\/]+$') + '\'
}
C:\Ravi\
C:\Ravi\
C:\
C:\
\
\
\
结尾。
Join-Path
cmdlet来为您构建路径,它会优雅地处理目录部分的尾随\
(例如,Join-Path C:\Ravi\ file.txt
会生成 C:\Ravi\file.txt
);相比之下,尾随的\\
会被保留:Join-Path C:\Ravi\\ file.txt
会生成 C:\Ravi\\file.txt
;但是,虽然这不太美观,但通常是无害的(这样的路径仍然可以用于访问文件系统)。
Join-Path
将在不修剪的情况下为您处理)。 - alrocSplit-Path
可能对你有用。 - alroc