C# 如何转义PowerShell提供程序返回的路径名
我正在编写一个用C#编写的PowerShell提供程序。提供程序公开一个对象树,对象树的名称是任意unicode字符串,可以包括字符,如C# 如何转义PowerShell提供程序返回的路径名,c#,powershell,path,escaping,C#,Powershell,Path,Escaping,我正在编写一个用C#编写的PowerShell提供程序。提供程序公开一个对象树,对象树的名称是任意unicode字符串,可以包括字符,如“,”,等等 我正在努力理解如何正确地返回这些名称,但还没有找到任何文档说明如何返回这些名称 PowerShell路径如何转义和显示 路径或路径段是否有长度限制 是否有语法或正则表达式来验证PowerShell路径或路径段 两个项目具有相同的名称(因此具有相同的路径)是否合法?在我的场景中就是这种情况,名称不要求唯一。(有唯一的属性,例如ID,但名称不唯一。)
“
,”
,等等
我正在努力理解如何正确地返回这些名称,但还没有找到任何文档说明如何返回这些名称
让我们看一下文件系统中的一个示例:
PS>dir foo*
目录:C:\Users\jimtru\AppData\Local\Temp
模式LastWriteTime长度名称
---- ------------- ------ ----
-a----2016年6月1日上午11点11分11福[酒吧].“巴兹”
-a----2016年1月6日上午11点13分8福[酒吧]。`baz`
首先要注意的是,有一些引号(单引号和反引号)是简单呈现的,没有额外的字符表示输出中的转义,但是,如果您只是尝试获取它们的内容,这些引号可能会导致PowerShell有点心痛:
PS>get content foo[bar]。'baz'
获取内容:指定路径foo[bar]处的对象。baz。。。
PS>获取内容foo[bar]。`baz`。。。
获取内容:指定路径foo[bar]az处的对象`
有几种方法可以解决此问题。我们为一些cmdlet提供-LiteralPath
:
PS>获取内容-文字路径“foo[bar]。“baz”
sdflkj
请注意,我在字符串周围包含了双引号。这是因为单引号将被视为字符串元素,因此'foo'
将被foo
替换,双引号表示解析器应该查看整个字符串(双引号到双引号)。另一种方法是使用转义字符(后引号)。
PS>获取内容'foo`[bar`.'baz`'
sdflkj
对于相同的路径,我建议您避免这种情况。您需要某种方法来消除一个实体与另一个实体之间的歧义。您应该确保您创建的路径对于您的资源是唯一的。请记住,您在提供程序中构造了此路径,以便可以将消除歧义功能添加到提供程序中
最后,在长度上有一些限制,可以用文件系统上的路径来表示“万一文档是1)希望路径转义只是关于如何输入字符串。如果不是,我想你必须在你的供应商那里处理这个问题。2) 我不认为提供者框架明确地限制了路径。4) 您的提供商必须了解如何处理此问题。当有两个项时,您将如何处理get item?@TravisPlunk,大约4)因为它们是对象,可以通过编程方式保存和过滤它们。它们确实具有唯一性,但唯一性不仅仅在于名称。例如,许多电子邮件可以具有相同的标题,但不同的基础唯一ID。电子邮件标题似乎自然地映射到PowerShell名称。我只是想确保这是在PuthBeSk中被接受的事情。@ TravisPlunk,考虑把你的评论改写为答案。大约1)在您提供的链接中,我没有找到任何关于转义路径分隔符的信息。我错过什么了吗?谢谢。路径中的路径分隔符(即/或\)如何?最初的文章是关于任意unicode路径的,因此需要知道提供者、cmdlet或脚本应该特别处理的字符集。