對一個實際存在的檔案 `D:\[abc]defg\[123]4567.mp4` 使用 `Test-Path` 函式驗證它是否存在,將會回傳 False。造成這個現象的原因是因為 PowerShell 使用 `*`, `?`, `[`, `]` 這4個字元作為萬元字元,而中括號又是合法的路徑字元,路徑字串中原本存在的中括號被當成萬用字元解釋,於是造成了這個問題。
對於支援萬用字元路徑參數值的參數,路徑字串中原本存在的中括號,若要避免將它們作為萬用字元,而是做為常值字元,則使用反引號跳脫字元可將中括號做為常值而不是萬用字元。
```powershell
Test-Path -Path ('D:\[abc]defg\[123]4567.mp4' -replace '([\`\[\]])', '`$1')
```
使用 `-LiteralPath` 代替 `-Path` ,引數路徑字串內的中括號將不被作為萬用字元而是常值字元。
```powershell
Test-Path -LiteralPath 'D:\[abc]defg\[123]4567.mp4'
```
在使用相對路徑時,無論路徑有沒有包含中括號,只要工作目錄路徑中包含中括號就會發生非預期的行為。為了避免此問題,必須先將相對路徑轉換成絕對路徑,再作為 `-LiteralPath` 參數的引數。將相對路徑轉為絕對路徑可以使用 $ExecutionContext.SessionState.Path.GetUnresolvedProviderPathFromPSPath() 方法。
```powershell
Set-Location -LiteralPath 'D:\[abc]defg'
Test-Path -LiteralPath $ExecutionContext.SessionState.Path.GetUnresolvedProviderPathFromPSPath('[123]4567.mp4')
```
應用 - ffmpeg 轉換 mp4 為 mkv 格式,路徑字串變數皆使用相對路徑:
```powershell
Set-Location -LiteralPath 'D:\[abc]defg'
$Env:Path = 'C:\ffmpeg\bin;' + $env:Path
$InputFileName = '[123]4567.mp4'
$OutputFileName = '[123]4567.mkv'
$LogFileName = $OutputFileName + '.log'
$ArgumentList = '-i ' + $InputFileName + ' -c copy ' + $OutputFileName
Start-Process -FilePath 'ffmpeg' -ArgumentList $ArgumentList -Wait -NoNewWindow -WorkingDirectory ($pwd.path -replace '([\`\[\]])', '`$1') -RedirectStandardError 'temp_ffmpeg.log'
Rename-Item -LiteralPath $ExecutionContext.SessionState.Path.GetUnresolvedProviderPathFromPSPath('temp_ffmpeg.log') -NewName $LogFileName
```
當使用 `Start-Process` 函式時,只要工作目錄中含有中括號就會發生非預期錯誤 ,即使沒有任何參數使用相對路徑。由於 `Start-Process` 可以使用 `-WorkingDirectory` 參數另外指定工作目錄,可以對工作目錄使用反引號逃脫字元讓中括號做為常值字元,再將此路徑作為 `-WorkingDirectory` 的引數。
`Start-Process` 函式的 `-RedirectStandardOutput` 與 `-RedirectStandardError` 兩個參數不允使用許萬用字元,但遇到路徑本身所包含的中括號也不會做為常值而是萬用字元,因此會發生錯誤。若使用反引號作為逃脫字元,輸出路徑會多出非預期的反引號字元。可以使用另外一個不含中括號的臨時檔名,之後再使用 `Rename-Item` 重新命名為目標檔名。
`Rename-Item` 與 `Test-Path` 有相同的問題,使用相對路徑時只要工作目錄路徑中包含中括號就會發生非預期的行為,所以不能使用相對路徑只能使用絕對路徑。

X