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