Команда Powershell для обрезки пути, если она заканчивается ""
мне нужно обрезать путь, если он заканчивается .
C:Ravi
мне нужно заменить на
C:Ravi
у меня случай, когда путь не закончится (тогда он должен пропустить).
Я пытался с .EndsWith("")
, но он терпит неудачу, когда у меня есть вместо
.
можно ли это сделать в PowerShell, не прибегая к условным обозначениям?
4 ответов
рассмотрите возможность использования TrimEnd
вместо (особенно если вы работаете с UNC
путь):
"C:\Ravi\".TrimEnd('\')
вы упоминаете о необходимости различать пути, заканчивающиеся на " \ "и"\\", и, возможно, обрабатывать их по-разному. Пока вы можете использовать .Trim("\")
или .TrimEnd("\")
чтобы удалить завершающий символ " \ " в приведенном примере, оба этих метода будут лишены все трейлинг косые черты с вашего пути.
вернется следующее регулярное выражение True если ваш путь заканчивается одним"\", но false, если он заканчивается несколькими символами"\":
$Path -match '.+[^\]\$'
в регулярное выражение означает:
- строка из как можно большего количества символов,
- что-то, что это не слеш
- С последующей обратной косой чертой
даем:
"C:\Ravi\" -match '.+[^\]\$'
True
"C:\Ravi\" -match '.+[^\]\$'
False
надеюсь, это поможет / интересно. :-)
Примечание: это решение представляет интерес только в том случае, если вам нужно обрезать максимум 2 трейлинг \
chars. хочу поддержать /
разделители путей тоже хотят правильно обрабатывать корневые пути или обычно интересуются методами регулярных выражений.
если это приемлемо для обрезки любой непустой пробег трейлинга \
chars. т. е., И 3 или больше (что вполне вероятно в этом случае) и root пути не нуждаются в специальных лечение, используйте простое решение Мартина Брандла.
решение на основе PowerShell -replace
оператор с регулярные выражения, который обрабатывает оба трейлинга \
и \
работает с /
, учитывая, что PowerShell принимает как \
и /
в качестве разделителя пути (что также заставит решение работать с PowerShell базовый, кросс-платформы издание):[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
[\/]
класс персонажа ([...]
), который соответствует одному символу, который является либо\
(сбежал как\
рассматриваться как литерал) или/
.[\/]?[\/]
игр один или два\
экземпляры в конце ($
) строки[\/]+
более свободно матчей один или несколько (+
).не задание строку замены эффективно выводит матч из строки; если совпадения нет, входная строка остается без изменений.
чтобы показать, что подход работает с различными путями, включая пути 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:\
\
\
обратите внимание, как корневые пути теперь заканчиваются на (один) \
.
специальный корпус корневых путей громоздок, поэтому он иногда предпочтительнее обеспечить вместо того чтобы удалить трейлинг -\
или /
(например, C:\Ravi
->C:\Ravi\
), чтобы облегчить построение путей с простой конкатенацией строк (без необходимости беспокоиться о удвоении \
chars.); регулярное выражение снова становится простым:
'C:\Ravi', 'C:\Ravi\', 'C:\', 'C:\', '\', '\' | % {
($_ -replace '[\/]+$') + '\'
}
это дает:
C:\Ravi\
C:\Ravi\
C:\
C:\
\
\
обратите внимание, как все пути теперь заканчиваются на (один)\
.
[1] иногда необходима манипуляция строками, но!--49-->часто вы можете положиться на чтобы построить пути для вас, который обрабатывает трейлинг \
в части каталога изящно (например, Join-Path C:\Ravi\ file.txt
доходность C:\Ravi\file.txt
); напротив, трейлинг \
сохраняется: Join-Path C:\Ravi\ file.txt
доходность C:\Ravi\file.txt
; однако, хотя это не очень красиво, это, как правило, доброкачественно (такие пути все еще работают для доступа к файловой системе).