转义路径中字符的函数
Function to escape characters in paths
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 命令返回的路径 returns 一个未转义的字符串;即 Get-ChildItem 'c:\temp\' -Filter 'test*.txt' | Convert-Path | Get-Item
失败(注意:如果我们传递实际的 FileSystemInfo
对象一切正常,但该对象没有具有正确转义字符串路径的属性)。
我们可以使用如下代码轻松逃避此问题:
$path = 'c:\temp\test[0123].txt'
$path = $path -replace '([][[])', '`' # 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 '([][[\*\?])', '`' # escapes ], [, *, and ?
})
}
}
特殊字符信息:
您可以使用以下方法:
[Management.Automation.WildcardPattern]::Escape('test[1].txt')
Returns:
test`[1`].txt
记录在此处:
https://docs.microsoft.com/en-us/dotnet/api/system.management.automation.wildcardpattern.escape
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 命令返回的路径 returns 一个未转义的字符串;即 Get-ChildItem 'c:\temp\' -Filter 'test*.txt' | Convert-Path | Get-Item
失败(注意:如果我们传递实际的 FileSystemInfo
对象一切正常,但该对象没有具有正确转义字符串路径的属性)。
我们可以使用如下代码轻松逃避此问题:
$path = 'c:\temp\test[0123].txt'
$path = $path -replace '([][[])', '`' # 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 '([][[\*\?])', '`' # escapes ], [, *, and ?
})
}
}
特殊字符信息:
您可以使用以下方法:
[Management.Automation.WildcardPattern]::Escape('test[1].txt')
Returns:
test`[1`].txt
记录在此处:
https://docs.microsoft.com/en-us/dotnet/api/system.management.automation.wildcardpattern.escape