如何转义PowerShell提供程序返回的路径名

时间:2016-05-30 03:34:47

标签: c# powershell path escaping

我正在编写用C#编写的PowerShell提供程序。提供程序公开一个对象树,其名称是任意unicode字符串,可以包含"'等字符。

我试图了解如何正确返回这些名称,但未能找到有关如何执行此操作的任何文档。

  1. PowerShell路径如何转义和显示?
  2. 路径或路径段是否有长度限制?
  3. 是否有语法或正则表达式来验证PowerShell路径或路径段?
  4. 两个项目具有相同名称(因此路径相同)是否合法?在我的场景中就是这种情况,其中名称不需要是唯一的。 (有一些独特的属性,例如ID,但名称不是唯一的。)

1 个答案:

答案 0 :(得分: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`

有很多方法可以解决这个问题。我们为某些cmdlet提供-LiteralPath PS> get-content -LiteralPath "foo[bar].'baz'" sdflkj

请注意我在字符串周围加了双引号。这是因为单引号将被视为字符串元素,因此'foo'将被foo替换,双引号表示解析器应该查看整个字符串(双引号到 - 双引号)。另一种方法是使用转义字符(反引号)。 PS> get-content 'foo`[bar`].`baz`' sdflkj

至于相同的路径,我建议你避免这样做。您需要某种方法来消除一个实体与另一个实体的歧义。您应该确保您创建的路径对您的资源是唯一的。请记住,您在提供商中构建此路径,因此您可以将消除歧义的功能添加为提供商的一部分。

最后,长度有一些限制,可以表示为文件系统上的路径 。 AFIK,非路径“路径”没有限制