2016-05-30 10 views
2

C#で書かれたPowerShellプロバイダを作成しています。プロバイダは、",'などの文字を含むことができる任意のユニコード文字列であるオブジェクトのツリーを公開します。PowerShellプロバイダから返されたパス名をエスケープする方法

これらの名前を適切に返す方法を理解しようとしていますが、その方法についてのドキュメントは見つかりませんでした。

  1. どのようにPowerShellパスをエスケープして表示しますか?
  2. パスのパスまたはセグメントに長さ制限がありますか?
  3. パスのPowerShellパスまたはセグメントを検証するための文法または正規表現はありますか?
  4. 2つのアイテムが同じ名前(したがって同じパス)を持つことは合法ですか?これは私のシナリオでは、名前が一意である必要はありません。 (。そこユニークな特性は、IDは、例えばですが、名前が一意ではありません)
+1

ドキュメントが[ここ](https://msdn.microsoft.com/en-us/library/ee126186(v=vs.85) .aspx) 1)パスエスケープは、文字列の入力方法と同じです。そうでない場合は、プロバイダでこれを処理する必要があると思います。 2)プロバイダのフレームワークが明示的にパスを制限しているとは思いません。 4)プロバイダはこれをどのように処理するかを理解する必要があります。 2つのアイテムがある場合、どのようにGet-Itemを処理しますか? – TravisEz13

+0

@ TravisPlunk、about 4)これらはオブジェクトなので、プログラムで保持してフィルタリングすることができます。彼らは一意性を持っていますが、一意性は単にその名の通りではありません。一例として、多くの電子メールは同じタイトルを持つことができますが、固有のIDは異なることがあります。電子メールのタイトルは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に置き換えられます。二重引用符は、パーサーが文字列全体を参照する必要があることを示します(二重引用符と二重引用符)。続行する別の方法は、エスケープ文字(バッククォート)を使用することです。 PS> get-content 'foo`[bar`].`baz`' sdflkj

同一のパスについては、回避することをお勧めします。あるエンティティを別のエンティティと区別するためには、何らかの方法が必要です。作成するパスは、リソース固有のものであることを確認する必要があります。プロバイダーでこのパスを構築するので、プロバイダーの一部として曖昧さのない機能を追加することができます。

最後に、ファイルシステム上のパスとして表現できる長さには制限があります。 AFIKでは、パス以外のパスには制限がありません

+0

ありがとう。パスの区切り文字、つまり/または\はどうでしょうか?元の投稿は任意のユニコードパスに関するものなので、プロバイダー、コマンドレット、またはスクリプトのいずれかによって特別に扱われる文字セットを知る必要があります。 – bright

関連する問題