如果路径以“\”结尾,则 Powershell 命令修剪路径

Posted

技术标签:

【中文标题】如果路径以“\\”结尾,则 Powershell 命令修剪路径【英文标题】:Powershell command to trim path if it ends with "\"如果路径以“\”结尾,则 Powershell 命令修剪路径 【发布时间】:2016-09-04 00:26:42 【问题描述】:

如果路径以\ 结尾,我需要修剪路径。

C:\Ravi\

我需要换成

C:\Ravi

我有一种情况,路径不会以\ 结尾(那么它必须跳过)。

我尝试使用.EndsWith("\"),但是当我使用\\ 而不是\ 时它失败了。

这可以在 PowerShell 中完成而不使用条件吗?

【问题讨论】:

为什么需要修剪这条路径?根据您的要求,可能有更好的方法来处理它(例如,如果您将字符串连接到路径中,Join-Path 将在不修剪的情况下为您处理)。 @alroc 我没有建立路径。我正在提取然后根据需要进行定义。 Split-Path 可能对你有用。 【参考方案1】:

不需要太复杂

"C:\Ravi\".trim('\')

【讨论】:

这行得通,但是因为它从 both 端进行修剪,所以它不适用于基于 UNC 的路径,例如 \\foo\bar "\\server\Ravi\".trimend('\') 将为 UNC 路径修复它。【参考方案2】:

考虑改用TrimEnd(尤其是在使用UNC 路径时):

"C:\Ravi\".TrimEnd('\')

【讨论】:

【参考方案3】:

您提到需要区分以“\”和“\\”结尾的路径,并可能以不同方式处理它们。虽然您可以使用 .Trim("\").TrimEnd("\") 删除您给出的示例中的尾随“\”字符,但这两种方法都会从您的路径中删除 all 尾随斜杠。

如果您的路径以单个“\”结尾,则以下正则表达式将返回 True,但如果它以多个“\”字符结尾,则返回 false:

$Path -match '.+[^\\]\\$'

正则表达式的意思是:

    尽可能多的字符串, 不超过反斜杠 后跟一个反斜杠

给予:

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

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

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

【讨论】:

【参考方案4】:

注意:此解决方案仅在您需要修剪 最多 2 个尾随 \ 字符、想要支持 / 路径分隔符、想要处理 root路径正确或通常对正则表达式技术感兴趣。如果可以修剪 任何 非空的尾随 \ 字符运行,也就是 3 或更多 em>(在这种情况下很可能)和 root 路径不需要特殊处理,使用 Martin Brandl's simple solution。

一种基于 PowerShell 的 -replace operator 和 regular expression 的解决方案,它处理尾随 \\\ 并且也适用于 /,因为 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

[\\/] 是一个字符类 ([...]),它匹配单个字符,即 \(转义为 \\ 以被视为文字)或 /

[\\/]?[\\/] 匹配 一个或两个 \ 字符串末尾的实例 ($),[\\/]+ 更松散地匹配 一个或多个 em> (+)。

未指定替换字符串有效地删除字符串中的匹配项;如果没有匹配,则输入字符串保持原样。

为了证明该方法适用于各种路径,包括 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:\
\
\

注意所有路径现在如何以(一个)\结尾。


[1] 有时字符串操作是必要的,但通常您可以依靠Join-Path cmdlet 为您构建路径,它可以优雅地处理目录部分中的尾随\ (例如,Join-Path C:\Ravi\ file.txt 产生 C:\Ravi\file.txt);相比之下,尾部的\\ 被保留:Join-Path C:\Ravi\\ file.txt 产生C:\Ravi\\file.txt;然而,虽然这并不漂亮,但它通常是良性的(这样的路径仍然可以访问文件系统)。

【讨论】:

以上是关于如果路径以“\”结尾,则 Powershell 命令修剪路径的主要内容,如果未能解决你的问题,请参考以下文章

如果单词以后缀之一结尾则标记为1

如果模式以 ; 结尾,则 Java 正则表达式匹配字符串或者啥都没有[重复]

如果字符串以某个值熊猫数据框结尾,则替换值

Java - 如果单词以用户输入的分隔符结尾,则执行 x

如何在向量的两个连续元素之间产生差异,如果差异小于 10,则删除以两个零结尾的一个

scss 一个SCSS函数,如果$ string以$ find结尾则返回true,否则返回false。