簡體   English   中英

對路徑中的字符進行轉義的函數

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM