読者です 読者をやめる 読者になる 読者になる

Invoke-WebRequestコマンドレットのエイリアスがcurl, wgetという落とし穴

PowerShell

職場 PC が Windows なのだが UNIX ライクなコマンドが使いたくて Gow を使っている。ところが、最近 PowerShell を 3.0 にアップデート*1したところ curl が上手く動かなくなった。調べたところ、Invoke-WebRequest コマンドレットのエイリアスcurl, wget が割り当てられているのが原因だった。忘れたときのためにメモしておく。
 

curl がエラーになる

PS >curl --silent http://www.yahoo.co.jp/
Invoke-WebRequest : 引数 'http://www.yahoo.co.jp/' を受け入れる位置指定パラメーターが見つかりません。
発生場所 C:\Users\ebi\bin\download.ps1:100 文字:1
+   curl --silent "http://www.yahoo.co.jp/"
+   ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidArgument: (:) [Invoke-WebRequest]、ParameterBindingException
    + FullyQualifiedErrorId : PositionalParameterNotFound,Microsoft.PowerShell.Commands.InvokeWebRequestCommand

 
エラーメッセージを読むと curl を Invoke-WebRequest コマンドレットとして実行しているのだが、まさかと思いつつエイリアスを調べてみるとそのまさかだった。
 

PS >Get-Alias -Definition Invoke-WebRequest

CommandType     Name                                               ModuleName
-----------     ----                                               ----------
Alias           curl -> Invoke-WebRequest
Alias           iwr -> Invoke-WebRequest
Alias           wget -> Invoke-WebRequest

 

解決

curl, wget のような紛らわしいエイリアスは要らないので削除する。

PS >Remove-Item -Path Alias:curl
PS >Remove-Item -Path Alias:wget

PS >Get-Alias -Definition Invoke-WebRequest

CommandType     Name                                               ModuleName
-----------     ----                                               ----------
Alias           iwr -> Invoke-WebRequest

 
これで curl.exe が使われるようになるがエイリアス削除は現在のセッションにしか反映されない。そこで $profile の中でエイリアス削除するようにした。
 

結論

Invoke-WebRequest コマンドレットに curl, wget みたいなエイリアスがあっても使いやすいとは思えない。と思ってしまうのだが、みんなどうなのだろう。

*1:ハンコが何個必要になったかは書かない