Powershell 命令到 trim 路径(如果它以“\”结尾)
Powershell command to trim path if it ends with "\"
如果路径以 \
结尾,我需要 trim 路径。
C:\Ravi\
我需要换成
C:\Ravi
我有一个路径不会以\
结尾的情况(那么它必须跳过)。
我尝试使用 .EndsWith("\")
,但是当我使用 \
而不是 \
时它失败了。
这可以在 PowerShell 中完成而不求助于条件吗?
无需过于复杂
"C:\Ravi\".trim('\')
考虑改用 TrimEnd
(尤其是在使用 UNC
路径时):
"C:\Ravi\".TrimEnd('\')
您提到需要区分以“\”和“\\”结尾的路径,并可能以不同方式处理它们。虽然您可以使用 .Trim("\")
或 .TrimEnd("\")
删除您给出的示例中的尾随“\”字符,但这两种方法都会从您的路径中删除 all 尾随斜线.
如果您的路径以单个“\”结尾,则以下正则表达式 return 为真,但如果以多个“\”字符结尾,则为假:
$Path -match '.+[^\]\$'
正则表达式表示:
- 一串尽可能多的字符,
- 最多不是反斜杠的东西
- 后跟一个反斜杠
给予:
"C:\Ravi\" -match '.+[^\]\$'
True
"C:\Ravi\" -match '.+[^\]\$'
False
希望这对您有所帮助/很有趣。 :-)
注意:只有当您需要 trim 至多 2 个尾随 \
个字符时,此解决方案才有意义,想要也支持 /
路径分隔符,希望正确处理根路径或通常对正则表达式技术感兴趣。
如果 trim 任何 尾随 \
个字符的非空 运行 可接受,即 3或 more (在这种情况下很可能)和 root 路径不需要特殊处理,使用 .
一种基于 PowerShell 的 -replace
operator with a regular expression 的解决方案,它处理尾随 \
和 \
,并且也适用于 /
,前提是 PowerShell 接受两者 \
和 /
作为路径分隔符(这也将使解决方案与 PowerShell Core,cross-platfom 版本一起工作):[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
[\/]
是一个字符 class ([...]
) 匹配单个字符 \
(转义为 \
被视为文字) 或 /
.
[\/]?[\/]
匹配字符串末尾 ($
) 一个或两个 \
个实例,[\/]+
更松散地匹配 一个或多个 (+
).
未有效地指定替换字符串从字符串中删除匹配项;如果没有匹配,则输入字符串左 as-is.
为了证明该方法适用于各种路径,包括 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]:)?\)\*$)|(.*?)(?:\+)$', ''
}
这产生:
C:\Ravi
C:\Ravi
C:\
C:\
\
\
请注意根路径现在如何以(一个)\
.
结尾
根路径的 special-casing 很麻烦,这就是为什么 有时 确保 而不是删除尾随 \
或 /
(例如,C:\Ravi
-> C:\Ravi\
),以便于通过简单的字符串连接构建路径(不必担心加倍 \
字符。);正则表达式再次变得简单:
'C:\Ravi', 'C:\Ravi\', 'C:\', 'C:\', '\', '\' | % {
($_ -replace '[\/]+$') + '\'
}
这产生:
C:\Ravi\
C:\Ravi\
C:\
C:\
\
\
请注意 所有 路径现在如何以(一个)\
.
结尾
[1] 有时需要进行字符串操作,但 通常您可以依靠 Join-Path
cmdlet 为您构建路径,它处理尾随 \
在目录部分 gracefully(例如,Join-Path C:\Ravi\ file.txt
产生 C:\Ravi\file.txt
);相比之下,保留尾随 \
:Join-Path C:\Ravi\ file.txt
产生 C:\Ravi\file.txt
;然而,虽然这并不漂亮,但它通常是良性的(这样的路径仍然适用于访问文件系统)。
如果路径以 \
结尾,我需要 trim 路径。
C:\Ravi\
我需要换成
C:\Ravi
我有一个路径不会以\
结尾的情况(那么它必须跳过)。
我尝试使用 .EndsWith("\")
,但是当我使用 \
而不是 \
时它失败了。
这可以在 PowerShell 中完成而不求助于条件吗?
无需过于复杂
"C:\Ravi\".trim('\')
考虑改用 TrimEnd
(尤其是在使用 UNC
路径时):
"C:\Ravi\".TrimEnd('\')
您提到需要区分以“\”和“\\”结尾的路径,并可能以不同方式处理它们。虽然您可以使用 .Trim("\")
或 .TrimEnd("\")
删除您给出的示例中的尾随“\”字符,但这两种方法都会从您的路径中删除 all 尾随斜线.
如果您的路径以单个“\”结尾,则以下正则表达式 return 为真,但如果以多个“\”字符结尾,则为假:
$Path -match '.+[^\]\$'
正则表达式表示:
- 一串尽可能多的字符,
- 最多不是反斜杠的东西
- 后跟一个反斜杠
给予:
"C:\Ravi\" -match '.+[^\]\$'
True
"C:\Ravi\" -match '.+[^\]\$'
False
希望这对您有所帮助/很有趣。 :-)
注意:只有当您需要 trim 至多 2 个尾随 \
个字符时,此解决方案才有意义,想要也支持 /
路径分隔符,希望正确处理根路径或通常对正则表达式技术感兴趣。
如果 trim 任何 尾随 \
个字符的非空 运行 可接受,即 3或 more (在这种情况下很可能)和 root 路径不需要特殊处理,使用
一种基于 PowerShell 的 -replace
operator with a regular expression 的解决方案,它处理尾随 \
和 \
,并且也适用于 /
,前提是 PowerShell 接受两者 \
和 /
作为路径分隔符(这也将使解决方案与 PowerShell Core,cross-platfom 版本一起工作):[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
[\/]
是一个字符 class ([...]
) 匹配单个字符\
(转义为\
被视为文字) 或/
.[\/]?[\/]
匹配字符串末尾 ($
) 一个或两个\
个实例,[\/]+
更松散地匹配 一个或多个 (+
).未有效地指定替换字符串从字符串中删除匹配项;如果没有匹配,则输入字符串左 as-is.
为了证明该方法适用于各种路径,包括 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]:)?\)\*$)|(.*?)(?:\+)$', ''
}
这产生:
C:\Ravi
C:\Ravi
C:\
C:\
\
\
请注意根路径现在如何以(一个)\
.
根路径的 special-casing 很麻烦,这就是为什么 有时 确保 而不是删除尾随 \
或 /
(例如,C:\Ravi
-> C:\Ravi\
),以便于通过简单的字符串连接构建路径(不必担心加倍 \
字符。);正则表达式再次变得简单:
'C:\Ravi', 'C:\Ravi\', 'C:\', 'C:\', '\', '\' | % {
($_ -replace '[\/]+$') + '\'
}
这产生:
C:\Ravi\
C:\Ravi\
C:\
C:\
\
\
请注意 所有 路径现在如何以(一个)\
.
[1] 有时需要进行字符串操作,但 通常您可以依靠 Join-Path
cmdlet 为您构建路径,它处理尾随 \
在目录部分 gracefully(例如,Join-Path C:\Ravi\ file.txt
产生 C:\Ravi\file.txt
);相比之下,保留尾随 \
:Join-Path C:\Ravi\ file.txt
产生 C:\Ravi\file.txt
;然而,虽然这并不漂亮,但它通常是良性的(这样的路径仍然适用于访问文件系统)。