[英]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 命令返回的路徑也會返回一個未轉義的字符串; 即Get-ChildItem 'c:\\temp\\' -Filter 'test*.txt' | Convert-Path | Get-Item
Get-ChildItem 'c:\\temp\\' -Filter 'test*.txt' | Convert-Path | Get-Item
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 ?
})
}
}
特殊字符的相關資料:
您可以使用以下方法:
[Management.Automation.WildcardPattern]::Escape('test[1].txt')
返回:
test`[1`].txt
記錄在這里:
https://docs.microsoft.com/en-us/dotnet/api/system.management.automation.wildcardpattern.escape
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.