Команда Powershell для обрезки пути, если она заканчивается ""

мне нужно обрезать путь, если он заканчивается .

C:Ravi

мне нужно заменить на

C:Ravi

у меня случай, когда путь не закончится (тогда он должен пропустить).

Я пытался с .EndsWith(""), но он терпит неудачу, когда у меня есть вместо .

можно ли это сделать в PowerShell, не прибегая к условным обозначениям?

4 ответов


нет необходимости усложнять

"C:\Ravi\".trim('\')

рассмотрите возможность использования TrimEnd вместо (особенно если вы работаете с UNC путь):

"C:\Ravi\".TrimEnd('\')

вы упоминаете о необходимости различать пути, заканчивающиеся на " \ "и"\\", и, возможно, обрабатывать их по-разному. Пока вы можете использовать .Trim("\") или .TrimEnd("\") чтобы удалить завершающий символ " \ " в приведенном примере, оба этих метода будут лишены все трейлинг косые черты с вашего пути.

вернется следующее регулярное выражение True если ваш путь заканчивается одним"\", но false, если он заканчивается несколькими символами"\":

$Path -match '.+[^\]\$'

в регулярное выражение означает:

  1. строка из как можно большего количества символов,
  2. что-то, что это не слеш
  3. С последующей обратной косой чертой

даем:

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