【问题标题】:Powershell - Split a string on a characterPowershell - 在字符上拆分字符串
【发布时间】:2020-10-08 19:41:11
【问题描述】:

我有一个包含如下文件路径的 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]

以及上述的各种其他组合,但不能完全得到我所追求的。有人可以帮忙吗?

【问题讨论】:

    标签: powershell powershell-2.0 powershell-3.0


    【解决方案1】:

    试试这样:

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

    如果你有$Item.Source 那么:

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

    【讨论】:

    • 这行得通——但如果列表中有没有子目录的项目——它们会被剥离,我只剩下 D:\CompanyData\REPORTS\ENQUIRIES。有没有办法强制它只从第 5 个正斜杠中删除?
    【解决方案2】:

    这是另一个使用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\
    

    【讨论】:

      【解决方案3】:

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

      $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, as many times as possible, giving back as needed (greedy)
      )                
      .                 Match any single character that is not a line break character
         *              Between zero and unlimited times, as many times as possible, giving back as needed (greedy)
      

      结果:

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

      【讨论】:

        【解决方案4】:

        简单的正则表达式版本:

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

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

        {1,5} 重复该模式 5 次

        【讨论】:

          猜你喜欢
          • 2019-12-16
          • 1970-01-01
          • 2013-09-26
          • 1970-01-01
          • 1970-01-01
          • 2018-09-07
          • 2014-08-31
          • 2011-01-08
          • 2014-10-12
          相关资源
          最近更新 更多