2016-05-30 6 views
2

Ich schreibe einen PowerShell-Anbieter, der in C# geschrieben wurde. Der Provider macht einen Baum von Objekten verfügbar, deren Namen willkürliche Unicode-Zeichenfolgen sind, die Zeichen wie ", ' usw. enthalten können.So können Sie von einem PowerShell-Anbieter zurückgegebene Pfadnamen umgehen

Ich versuche zu verstehen, wie man diese Namen richtig zurückgibt, aber war nicht in der Lage, irgendeine Dokumentation dafür zu finden.

  1. Wie werden PowerShell-Pfade maskiert und angezeigt?
  2. Gibt es Längenbeschränkungen für Pfade oder Segmente eines Pfades?
  3. Gibt es eine Grammatik oder einen regulären Ausdruck, um PowerShell-Pfade oder Segmente eines Pfads zu validieren?
  4. Ist es zulässig, dass zwei Elemente denselben Namen (und damit denselben Pfad) haben? Dies ist in meinem Szenario der Fall, in dem Namen nicht eindeutig sein müssen. (Es gibt einzigartige Eigenschaften wie zB eine ID, aber die Namen sind nicht eindeutig.)
+1

Nur für den Fall, dass die Dokumente [hier] sind (https://msdn.microsoft.com/en-us/library/ee126186 (v = vs.85) .aspx) 1) Hoffentlich würde Path Escaping nur darum gehen, wie Sie die Zeichenfolge eingeben. Wenn es nicht ist, denke ich, dass Sie das in Ihrem Provider handhaben müssen. 2) Ich glaube nicht, dass das Provider-Framework den Pfad explizit begrenzt. 4) Ihr Provider müsste verstehen, wie man damit umgeht. Wie würdest du mit Get-Item umgehen, wenn es zwei Items gibt? – TravisEz13

+0

@TravisPlunk, etwa 4) da sie Objekte sind, können sie programmgesteuert gehalten und gefiltert werden. Sie haben Einzigartigkeit, aber die Einzigartigkeit ist nicht einfach im Namen. Beispielsweise können viele E-Mails den gleichen Titel, aber unterschiedliche zugrunde liegende eindeutige IDs haben. Der E-Mail-Titel scheint dem PowerShell-Namen natürlich zuzuordnen. Ich möchte nur sichergehen, dass dies in PowerShell akzeptiert wird. – bright

+0

@TravisPlunk, überdenken Sie Ihren Kommentar als Antwort. Über 1) Ich habe in dem von Ihnen bereitgestellten Link keine Informationen zu den Trennzeichen für austretende Pfade gefunden. Habe ich etwas verpasst? – bright

Antwort

1

auf ein Beispiel in dem Dateisystem aussehen lassen: 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` das erste, was zu bemerken ist, gibt es Anführungszeichen (Einzel- und zurück), die einfach gemacht werden, jedoch keine zusätzlichen Zeichen Hemmung in der Ausgabe, die anzeigt, verursachen diese könnten ein wenig Sodbrennen Powershell, wenn Sie nur versuchen, ihre Inhalte zu erhalten:

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`

gibt es ein paar Möglichkeiten, um Dies. Wir bieten -LiteralPath für einige Cmdlets: PS> get-content -LiteralPath "foo[bar].'baz'" sdflkj

Beachten Sie, dass ich doppelte Anführungszeichen um die Zeichenfolge enthalten haben. Dies liegt daran, dass die einfachen Anführungszeichen als String-Element behandelt würden, sodass durch foo ersetzt würde. Die doppelten Anführungszeichen geben an, dass der Parser die gesamte Zeichenfolge (double-quote-to-double-quote) betrachten sollte. Eine andere Möglichkeit ist das Verwenden des Escape-Zeichens (Rückwärts-Anführungszeichen). PS> get-content 'foo`[bar`].`baz`' sdflkj

Wie für Pfade, die identisch sind, würde ich vorschlagen, dass Sie das vermeiden. Sie brauchen einen Weg, um eine Entität von einer anderen zu unterscheiden. Sie sollten sicherstellen, dass der von Ihnen erstellte Pfad für Ihre Ressource eindeutig ist. Denken Sie daran, dass Sie diesen Pfad in Ihrem Provider erstellen, damit Sie die Entscheiderfunktionen als Teil Ihres Providers hinzufügen können.

Schließlich gibt es Einschränkungen für die Länge, die als Pfad auf dem Dateisystem ausgedrückt werden kann. AFIK, gibt es keine Einschränkungen für nicht-Pfad "Pfade"

+0

danke. Was ist mit Pfadtrennzeichen, d. H./Oder \ im Pfad? Im ursprünglichen Beitrag geht es um beliebige Unicode-Pfade. Sie müssen also die Zeichenmenge kennen, die speziell vom Anbieter, Cmdlets oder Skripts behandelt werden soll. – bright