#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 раз