用于转义路径

时间:2017-09-04 12:29:02

标签: powershell path escaping powershell-v3.0 microsoft-bits

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

然而,在逃避字符串时,标准建议是避免推出自己的解决方案/使用语言解决这些问题的方法。

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 ?
        })
    }
}

有关特殊字符的信息:

1 个答案:

答案 0 :(得分:5)

您可以使用以下方法:

[Management.Automation.WildcardPattern]::Escape('test[1].txt')

返回:

test`[1`].txt

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