Powershell — разделить строку на символ

#powershell #powershell-2.0 #powershell-3.0

#powershell #powershell-2.0 #powershell-3.0

Вопрос:

У меня есть CSV-файл, полный путей к файлам, как показано ниже:

 D:CompanyDataREPORTSENQUIRIESOld House FarmImages
D:CompanyDataREPORTSENQUIRIESQuay HouseText
D:CompanyDataREPORTSENQUIRIESChurch RoadPhotography
D:CompanyDataREPORTSENQUIRIESChurch RoadReports
D:CompanyDataREPORTSENQUIRIESChurch RoadReportsImages
  

Я хочу разделить их на 5-м символе ‘/’, чтобы вернуть следующее (включая последнее завершающее ‘/’

 D:CompanyDataREPORTSENQUIRIESOld House Farm
D:CompanyDataREPORTSENQUIRIESQuay House
D:CompanyDataREPORTSENQUIRIESChurch Road
D:CompanyDataREPORTSENQUIRIESChurch Road
D:CompanyDataREPORTSENQUIRIESChurch Road
  

До сих пор я пробовал следующее:

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

И различные другие комбинации из вышеперечисленного, но я не могу понять, что мне нужно. Кто-нибудь может помочь?

Ответ №1:

Попробуйте так:

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

Если у вас есть $Item.Source , то:

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

Комментарии:

1. Это работает, но если в списке есть элементы без подкаталогов — они удаляются, и у меня остается только D:CompanyDataREPORTSENQUIRIES . Есть ли способ заставить ее так, чтобы она удалялась только с 5-й косой черты?

Ответ №2:

Вот другое решение, использующее Select-String

(Обратите внимание, что шаблон использует regex , поэтому вам нужно экранировать обратную косую черту другой обратной косой чертой)

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

Вывод:

 D:CompanyDataREPORTSENQUIRIESOld House Farm
D:CompanyDataREPORTSENQUIRIESQuay House
D:CompanyDataREPORTSENQUIRIESChurch Road
D:CompanyDataREPORTSENQUIRIESChurch RoadReports
D:CompanyDataREPORTSENQUIRIESChurch RoadReports
  

Ответ №3:

Вы можете разделить каждый путь к файлу на обратную косую черту, чтобы получить массив частей. Затем соедините максимум 5 частей обратной косой чертой и добавьте другую обратную косую черту, чтобы:

 $parts = "D:CompanyDataREPORTSENQUIRIESOld House FarmImages" -split '\'
'{0}' -f ($parts[0..[math]::Min($parts.Count, 4)] -join '')
  

Или сделайте это с помощью регулярного выражения:

 "D:CompanyDataREPORTSENQUIRIESOld House FarmImages" -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:CompanyDataREPORTSENQUIRIESOld House Farm
  

Ответ №4:

Простая версия регулярных выражений:

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

[^\] \ соответствует 1-n, за которым не следует

{1,5} повторите шаблон 5 раз