2025/10/19(日)PowerShellでワイルドカード文字 [ ] を含むパスへのリンクをNew-Itemで作れない問題が修正される予定
PowerShellのワイルドカード文字 [ ] 問題
PowerShellの多くのコマンドレットは [ ] を含んだパスをワイルドカードと解釈します。
Get-Item -Path "[abc].txt" Name ---- a.txt b.txt c.txt
たいていの場合これは望んでいない動作なので、ワイルドカード処理を行わない-LiteralPathを使うことがPowerShellではほぼ必須です。(あまりに残念な失敗仕様……。)
Get-Item -LiteralPath "[abc].txt" Name ---- [abc].txt
New-Itemでのリンク作成時のワイルドカード文字問題
New-Itemでのリンク作成時の -Target (または -Value) にも同様の問題があります。厄介なことに、-LiteralPathのようなワイルドカード処理を無効化する手段がありません。
New-Item -ItemType SymbolicLink -Path "link.txt" -Target "[abc].txt" Name ---- link.txt -> a.txt
一応、バッククォート(`)で二重エスケープすれば作れなくもありません。
New-Item -ItemType SymbolicLink -Path "link.txt" -Target "````[abc````].txt" Name ---- link.txt -> [abc].txt
パスが変数とかに入っている場合はエスケープする関数とかを作るか[WildcardPattern]::Escapeを2回使えば同じ効果。
New-Item -ItemType SymbolicLink -Path "link.txt" -Target ([WildcardPattern]::Escape([WildcardPattern]::Escape("[abc].txt")))
ただし、この方法でも中間パスに [ ] が含まれている場合は失敗します。
New-Item -ItemType SymbolicLink -Path "link.txt" -Target ([WildcardPattern]::Escape([WildcardPattern]::Escape("[xyz]\1\2.txt"))) New-Item: Cannot find path '``[xyz``]\1\2.txt' because it does not exist. Test-Path -LiteralPath "[xyz]\1\2.txt" True
結局、一番確実なのは、残念なことに以下の方法です。
& cmd "/c" mklink "link.txt" "[xyz]\1\2.txt"
v7.6.0で修正予定
この問題はIssueに挙がっていて、割と最近TargetをLiteral扱いする修正が入ることになったようです。
v7.6.0-preview.5 Releaseで試したところ直っていました。たぶん次の正式リリース時には修正されそうです。
New-Item -ItemType SymbolicLink -Path "link.txt" -Target "[xyz]\1\2.txt" Name ---- link.txt -> [xyz]\1\2.txt