如果路径以>> 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中完成,而无需诉诸条件吗?
答案 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}}
希望这有助于/有趣。 : - )
答案 3 :(得分:0)
注意:如果您需要修剪最多 2个尾随\
字符,此解决方案才有意义。想要支持/
路径分隔符,想要正确处理根路径或者通常对正则表达式技术感兴趣
如果可以接受修剪任何非空的\
个字符,那么 3或更多(这很可能在这种情况下)和 root 路径不需要特殊处理,使用Martin Brandl's simple solution。
基于PowerShell -replace
operator的regular 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
;然而,虽然这不是很好,但它通常是良性的(这样的路径仍然可以用于访问文件系统)。