用于转义路径中字符的函数

Joh*_*van 4 powershell escaping path microsoft-bits powershell-3.0

PowerShell中是否有一个函数用于转义路径中的字符?

注意:我知道提供Path参数的大多数cmdlet 也提供了LiteralPath解决此问题的参数.这个问题更多来自好奇心而不是需要,就像我能想到的大多数用例一样,切换到LiteralPath有意义.但是有一些真正的用例(例如Start-BitsTransfer有一个Source参数,但没有文字等价物).

详情

如果我有一个文件c:\temp\test[0123].txt,而不是Get-Item 'c:\temp\test[0123].txt',我必须Get-Item 'c:\temp\test`[0123`].txt'用来获得结果(或使用LiteralPath参数).

甚至另一个PowerShell命令返回的路径也会返回一个未转义的字符串; 即Get-ChildItem 'c:\temp\' -Filter 'test*.txt' | Convert-Path | Get-Item失败(注意:如果我们传递实际FileSystemInfo对象全部工作,但该对象没有正确转义字符串路径的属性).

我们可以使用下面的代码轻松逃避:

$path = 'c:\temp\test[0123].txt'
$path = $path -replace '([][[])', '`$1' # escape square brackets by adding back ticks
Get-Item $path
Run Code Online (Sandbox Code Playgroud)

但是,当转义字符串时,标准建议是避免滚动自己的解决方案/使用语言解决这些问题的方法.

PowerShell中是否存在用于此目的的任何预先存在的功能,或任何推荐的接近此功能的方法; 或者是使用定制功能的唯一选择(例如下面)?

function ConvertFrom-LiteralPath {
    [CmdletBinding()]
    param (
        [Parameter(Mandatory = $true, ValueFromPipeline = $true)]
        [string]$LiteralPath
    )
    process {
        (New-Object -TypeName 'PSObject' -Property @{
            LiteralPath = $LiteralPath
            Path = $LiteralPath -replace '([][[\*\?])', '`$1' # escapes ], [, *, and ?
        })
    }
}
Run Code Online (Sandbox Code Playgroud)

有关特殊字符的信息:

Mar*_*agg 6

您可以使用以下方法:

[Management.Automation.WildcardPattern]::Escape('test[1].txt')
Run Code Online (Sandbox Code Playgroud)

返回:

test`[1`].txt
Run Code Online (Sandbox Code Playgroud)

记录在这里:https://msdn.microsoft.com/en-us/library/system.management.automation.wildcardpattern.escape(v=vs.85).aspx