Команда 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; однако, хотя это не очень красиво, это, как правило, доброкачественно (такие пути все еще работают для доступа к файловой системе).