2016-05-30 4 views
2

Я пишу поставщика PowerShell, написанного на C#. Поставщик предоставляет дерево объектов, имена которых являются произвольными строками unicode, которые могут включать символы, такие как ", ' и т. Д.Как избежать имен путей, возвращаемых поставщиком PowerShell

Я пытаюсь понять, как правильно вернуть эти имена, но не смог найти документацию о том, как это сделать.

  1. Каковы пути PowerShell, экранированные и отображаемые?
  2. Существуют ли ограничения длины на дорожки или сегменты пути?
  3. Существует ли грамматика или регулярное выражение для проверки путей или сегментов пути PowerShell?
  4. Является ли законным для двух предметов одинакового имени (и, следовательно, одного и того же пути)? Это имеет место в моем сценарии, где имена не обязательно должны быть уникальными. (Есть уникальные свойства например, идентификатора, но имена не являются уникальными.)
+1

На всякий случай документы [здесь] (https://msdn.microsoft.com/en-us/library/ee126186 (v = vs.85) .aspx) 1) Надеемся, что путь к экрану будет только о том, как вводить строку. Если это не так, я думаю, вам придется обрабатывать это в своем провайдере. 2) Я не думаю, что инфраструктура поставщика ограничивает путь явно. 4) Ваш провайдер должен будет понять, как с этим справиться. Как бы вы обрабатывали get-item, когда есть два элемента? – TravisEz13

+0

@TravisPlunk, около 4), поскольку они являются объектами, которые можно удерживать и фильтровать программно. У них есть уникальность, но уникальность - это не просто имя. Например, многие электронные письма могут иметь одно и то же название, но разные базовые уникальные идентификаторы. Название электронной почты, по-видимому, естественно относится к имени PowerShell. Я просто хочу быть уверенным, что это принято делать в PowerShell. – bright

+0

@TravisPlunk, рассмотрите вопрос о переписывании вашего комментария в качестве ответа. Около 1) Я не нашел никакой информации об экранирующих разделителях пути в указанной вами ссылке. Я что-то пропустил? – bright

ответ

1

давайте рассмотрим на примере в файловой системе: PS> dir foo* Directory: C:\Users\jimtru\AppData\Local\Temp Mode LastWriteTime Length Name ---- ------------- ------ ---- -a---- 6/1/2016 11:11 AM 11 foo[bar].'baz' -a---- 6/1/2016 11:13 AM 8 foo[bar].`baz` первое, что нужно заметить, есть кавычки (одинарные и обратно), которые оказываются просто, никакие дополнительные символы, указывающие спуск на выходе, однако, это не могут привести к PowerShell немного изжоги, если вы просто пытаетесь получить их содержание:

PS> get-content foo[bar].'baz' get-content : An object at the specified path foo[bar].baz... PS> get-content foo[bar].`baz`... get-content : An object at the specified path foo[bar]az`

есть несколько способов вокруг это. Мы предоставляем -LiteralPath для некоторых командлетов: PS> get-content -LiteralPath "foo[bar].'baz'" sdflkj

Обратите внимание, что я включил двойные кавычки вокруг строки. Это связано с тем, что одинарные кавычки будут обрабатываться как строковый элемент, поэтому 'foo' будет заменен на foo, двойные кавычки означают, что анализатор должен смотреть на всю строку (двойная кавычка на двойную кавычку). Другой способ продолжения - использовать escape-символ (обратная кавычка). PS> get-content 'foo`[bar`].`baz`' sdflkj

Что касается путей, которые идентичны, я бы предложил вам избежать этого. Вам нужно каким-то образом устранить одно сущность от другого. Вы должны быть уверены, что созданный вами путь уникален для вашего ресурса. Помните, что вы создаете этот путь у своего провайдера, поэтому вы можете добавить функции устранения неоднозначности как часть вашего провайдера.

И наконец, существуют ограничения по длине, которые могут быть выражены как путь в файловой системе. AFIK, нет ограничений на пути без пути «0»

+0

спасибо. Как насчет разделителей путей, т. Е./Или \, в пути? Оригинальное сообщение касается произвольных путей unicode, поэтому вам нужно знать набор символов, которые должны обрабатываться специально либо поставщиком, командлеты, либо скриптами. – bright

Смежные вопросы