Обрезка путей и строк в Powershell - PullRequest
1 голос
/ 09 февраля 2011

Я выполняю некоторую работу, связанную с некоторым автоматическим перемещением файлов, и эти файлы содержат относительные пути, которые необходимо поддерживать.К сожалению, я считаю, что средства, предлагаемые операторами System.IO.Path, System.String и Powershell, немного плохо приспособлены для изящного управления моей работой.

Одна функция, которая была бы очень полезна дляЯ - это понятие вычитания путей, которое теоретически работало бы как вычитание векторов.Концептуально, A - B дает вам путь от B к A. В приложении к путям D:\A\B\C\D - D:\A\B\ = \C\D.Аналогично, D:\A\B\ - D:\A\B\C\D = \..\.. в этом случае.На данный момент я могу согласиться с тем, что это имеет смысл только тогда, когда один путь целиком содержится в другом.

Это, как представляется, состоит из двух этапов: 1) определение содержания одного пути в другом.2) удалить содержащийся путь из содержащего пути.3) При необходимости замените имена папок родительским символом .. в зависимости от односторонности операции.

Поскольку я занимаюсь NTFS, мне нужно, чтобы операции локализации и замены не учитывали регистр.Для сдерживания я могу использовать select-string, так как он не чувствителен к регистру и позволяет использовать ключ -simple, который позволяет мне использовать путь, не разбивая его на части, чтобы избежать их для регулярного выражения.

Удаление строки издругой немного более раздражает, хотя.System.IO.Path ничего не имеет для этого, все подходящие методы System.String чувствительны к регистру, а все операторы powershell требуют массирования, чтобы регулярное выражение совпадало.

Все это выглядит как большая работа, чем следовало быбыть - есть какие-то инструменты, которые мне не хватает, которые бы лучше справились с этим?

Ответы [ 2 ]

2 голосов
/ 09 февраля 2011
  1. Определить сдерживание - преобразовать ваши пути в абсолютные (если это еще не сделано).Вы можете использовать Resolve-Path для этого.Затем вы можете использовать $ path1.StartsWith ($ path2, 'OrdinalIgnoreCase') для проверки на наличие содержимого.

  2. Удалить содержащийся путь - $ path1.Substring ($ path2.length)

  3. Замените имена родительских папок на ... - хотя у меня нет регулярных выражений в верхней части головы, я почти уверен, что вы могли бы сделать это с помощью поиска / замены регулярного выражения, используяЗаменяющий оператор PowerShell

2 голосов
/ 09 февраля 2011

filedirectorypath , в CodePlex, может предложить то, что вам нужно

Это не специфичный для PowerShell API, но это не причина, чтобы не использовать его из PowerShell.

Преимущества NDepend.Helpers.FilePathDirectory по сравнению с классом .NET Framework System.IO.Path включают:

  • Строго набранный путь к файлу / каталогу.
  • Преобразование относительного / абсолютного пути.
  • API нормализации пути
  • API проверки правильности пути
  • API сравнения путей
  • API просмотра пути.
  • API перебазирования пути
  • Список операций с путями (TryGetCommonRootDirectory, GetListOfUniqueDirsAndUniqueFileNames, список равенств…)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...