Powershell-在字符上分割字符串

问题描述

我有一个CSV文件,其中包含如下所示的文件路径:

D:\CompanyData\REPORTS\ENQUIRIES\Old House Farm\Images
D:\CompanyData\REPORTS\ENQUIRIES\Quay House\Text
D:\CompanyData\REPORTS\ENQUIRIES\Church Road\Photography
D:\CompanyData\REPORTS\ENQUIRIES\Church Road\Reports\
D:\CompanyData\REPORTS\ENQUIRIES\Church Road\Reports\Images

我想在第5个“ /”字符上拆分它们以返回以下内容包括最后一个尾随的“ /”

D:\CompanyData\REPORTS\ENQUIRIES\Old House Farm\
D:\CompanyData\REPORTS\ENQUIRIES\Quay House\
D:\CompanyData\REPORTS\ENQUIRIES\Church Road\
D:\CompanyData\REPORTS\ENQUIRIES\Church Road\
D:\CompanyData\REPORTS\ENQUIRIES\Church Road\

到目前为止,我已经尝试了以下方法

$source = $Item.source.Split("\")[0]

以及上述各种其他组合,但无法完全满足我的要求。谁能帮忙?

解决方法

尝试这样:

[string](Split-Path "PATH")+"\"

如果您有$Item.Source,则:

[string](Split-Path "$($Item.Source)")+"\"
,

您可以在反斜杠上拆分每个文件路径,以获取零件数组。然后以反斜杠加入最多5个部分,并附加另一个反斜杠tyo:

$parts = "D:\CompanyData\REPORTS\ENQUIRIES\Old House Farm\Images" -split '\\'
'{0}\' -f ($parts[0..[math]::Min($parts.Count,4)] -join '\')

或使用正则表达式执行此操作:

"D:\CompanyData\REPORTS\ENQUIRIES\Old House Farm\Images" -replace '^(([^\\]+\\){1,5}).*','$1'

正则表达式详细信息:

^                 Assert position at the beginning of the string
(                 Match the regular expression below and capture its match into backreference number 1
   (              Match the regular expression below and capture its match into backreference number 2
      [^\\]       Match any character that is NOT a “A \ character”
         +        Between one and unlimited times,as many times as possible,giving back as needed (greedy)
      \\          Match the character “\” literally
   ){1,5}         Between one and 5 times,giving back as needed (greedy)
)                
.                 Match any single character that is not a line break character
   *              Between zero and unlimited times,giving back as needed (greedy)

结果:

D:\CompanyData\REPORTS\ENQUIRIES\Old House Farm\
,

简单的正则表达式版本:

$Item.Source -replace "(('[^\\]+\\){1,5}).*",'$1'

[^\\]+\\匹配1-n个非\后跟\

{1,5}重复图案5次

,

这是使用Select-String

的另一种解决方案

(请注意,该模式使用regex,因此您需要使用另一个反斜杠\来转义反斜杠\

$source = ($($Item.Source) | Select-String -Pattern '.+\\.+\\.+\\.+\\.+\\' -AllMatches).Matches.Value

输出:

D:\CompanyData\REPORTS\ENQUIRIES\Old House Farm\
D:\CompanyData\REPORTS\ENQUIRIES\Quay House\
D:\CompanyData\REPORTS\ENQUIRIES\Church Road\
D:\CompanyData\REPORTS\ENQUIRIES\Church Road\Reports\
D:\CompanyData\REPORTS\ENQUIRIES\Church Road\Reports\